PHP | 直接ダウンロード ファイルの問題 (HTTPS をサポート)

序文

これはワンストップサービスのphpダウンロードファイルソリューションです。リモート ファイルとローカル サーバー内のファイルをダウンロードするためのメソッドのコレクション。

この記事を書いた理由は、ファイルをブラウザから開くのではなく直接ダウンロードするという以前の要件がプロジェクトにあったためです。インターネットから多くの方法を見つけましたが、ほとんどはローカルサーバーにファイルを直接ダウンロードします。長い間探した結果、最終的に良い解決策を見つけました。PHPブラウザでファイルを直接ダウンロードする_weixin_33862993 のブログ - CSDN ブログコードファーマーの 80% がアーキテクトになれないのはなぜですか? >>> ... https://blog.csdn.net/weixin_33862993/article/details/91745023

ただし、このリンクは https をサポートしていません。そこで、少し修正して、多くを語らずにコードに直接進みました。

<?php
/**
 *
 *
 * sys_download_file('web服务器中的文件地址', 'test.jpg');
 * sys_download_file('远程文件地址', 'test.jpg', true);
 *
 *
 *
 * @param $path  文件地址:针对当前服务器环境的相对或绝对地址
 * @param null $name 下载后的文件名(包含扩展名)
 * @param bool $isRemote 是否是远程文件(通过 url 无法获取文件扩展名的必传参数 name)
 * @param bool $isSSL 是否是HTTPS协议
 * @param string $proxy
 * @return bool true|false
 */
function sys_download_file($path, $name = null, $isRemote = false, $isSSL = 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) {
        $file = empty('') ? pathinfo($path,PATHINFO_BASENAME) : '';
        $dir = pathinfo($file,PATHINFO_DIRNAME);
        !is_dir($dir) && @mkdir($dir,0755,true);
        $url = str_replace(" ","%20",$path);

        if(function_exists('curl_init')) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            $temp = curl_exec($ch);
            if (@file_put_contents($file, $temp) && !curl_error($ch)) {
                $fileRelativePath = './'.$file;
            } else {
                return false;
            }
        }
    }
    // 执行下载
    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;
    }
}
//下载远程文件
sys_download_file('https://xxx.xxx.xxx/download/M0/xxxx.pdf','xxxx.pdf',true,true);
//下载本地文件
sys_download_file('F:\Visual-AMP-x64\www\Demo1\ico_checkon.svg','ico_checkon.svg',false,false);

おすすめ

転載: blog.csdn.net/m0_37572422/article/details/106493655