PHP PHP 浏览器直接下载文件

dean · 2019-10-30 09:07:22 · 热度: 268

本函数主要通过相对路径和绝对路径(url地址)直接下载文件,有些浏览器会打开文件下载保存的对话框(比如IE)。

/**
 * 文件直接下载
 * @uses
 *
 *      sys_download_file('web服务器中的文件地址', 'test.jpg');
 *      sys_download_file('远程文件地址', 'test.jpg', true);
 *
 * @param  string  $path     文件地址:针对当前服务器环境的相对或绝对地址
 * @param  string  $name     下载后的文件名(包含扩展名)
 * @param  boolean $isRemote 是否是远程文件(通过 url 无法获取文件扩展名的必传参数 name)
 * @param  string  $proxy    代理,适用于需要使用代理才能访问外网资源的情况
 * @return 下载结果 true|false
 */
function sys_download_file($path, $name = null, $isRemote = false, $proxy = '') {

    $fileRelativePath = $path;
    $savedFileName = $name;
    if (!$savedFileName) {
        $file = pathinfo($path);
        if (!empty($file['extension'])) {
            $savedFileName = $file['basename'];
        } else {
            echo 'Extension get failed, parameter \'name\' is required!';
            return false;
        }
    }

    // 如果是远程文件,先下载到本地
    if ($isRemote) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $path);
        if ($proxy != '') {
            curl_setopt($ch, CURLOPT_PROXY, $proxy);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 50);
        $fileContent = curl_exec($ch);
        curl_close($ch);

        // 写入临时文件
        $fileRelativePath = tempnam(sys_get_temp_dir(), 'DL');
        $fp = @fopen($fileRelativePath, 'w+');
        fwrite($fp, $fileContent);
    }

    // 执行下载
    if (is_file($fileRelativePath)) {
        header('Content-Description: File Transfer');
        header('Content-type: application/octet-stream');
        header('Content-Length:' . filesize($fileRelativePath));
        if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { // for IE
            header('Content-Disposition: attachment; filename="' . rawurlencode($savedFileName) . '"');
        } else {
            header('Content-Disposition: attachment; filename="' . $savedFileName . '"');
        }
        readfile($fileRelativePath);
        if ($isRemote) {
            unlink($fileRelativePath); // 删除下载远程文件时对应的临时文件
        }
        return true;
    } else {
        echo 'Invalid file: ' . $fileRelativePath;
        return false;
    }
}

猜你喜欢:
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册