• 技术文章 >后端开发 >php教程

    php下载远程文件的源码介绍

    不言不言2019-08-19 18:10:21转载1337

    本篇文章给大家带来的内容是关于php下载远程文件的源码介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    最近遇到下载pdf格式的文件存在问题 下载后看不了还有下载不了的问题

    大致思路是将文件先从远程下载后 再读取下载到用户本地电脑 再将文件删除 不多说了 直接贴源码

    远程文件的命名 最好使用英文数字组合 ,不要用中文命名 总会遇到你想不到的问题

    里面也包括压缩下载 具体 大家看源码 研究吧

    <?php
    set_time_limit(0);
    //允许下载的url
    $allowed_url = [
        '',
        '',
        '']; // 允许的url
    //$file_urls = post('file_urls');
    $file_urls = '';//远程文件路径
    
    $file_url_arr = explode(',', $file_urls);
    $file_url_arr = array_unique($file_url_arr); // 过滤相同url
    
    //foreach ($file_url_arr as $key => $val) {
    //    $url_arr = parse_url($val);
    //    if (!isset($url_arr['host']) || !in_array($url_arr['host'], $allowed_url)) {
    //        unset($file_url_arr[$key]);
    //    }
    //}
    if (empty($file_url_arr)) {
        $output = array(
            'status' => 2,
            'code' => 999,
            'error' => '未找到合法url',
        );
        exit(json_encode($output));
    }
    
    $download_dir = ROOT.'download'.DIRECTORY_SEPARATOR;
    if(!file_exists($download_dir)) mkdir($download_dir, 0777, true);
    $tmp_dir = $download_dir.time().rand(100, 999).DIRECTORY_SEPARATOR; // 文件临时存放目录
    
    $downloader = new fileDownloader();
    
    if($file_url_arr && !empty($file_url_arr)) $downloader->download($tmp_dir, $file_url_arr); // 下载文件
    
    $file_lists = scandir($tmp_dir);
    $file_lists = array_diff($file_lists, ['.', '..']);
    $file_lists = array_values($file_lists); // 重置索引
    if(empty($file_lists)){
        $output = array(
            'status' => 2,
            'code' => 999,
            'error' => '无下载文件',
        );
        exit(json_encode($output));
    }
    
    //if (count($file_lists) > 1) { // 如果是多个文件就压缩
    //    $file_name = $downloader->compress($tmp_dir, $subject_title);
    //} else {
        $file_name = $file_lists[0]; // 如果是单个文件就直接输出
    //}
    
    $file_headers = get_headers($file_urls, 1);
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    //header('Content-disposition: attachment; filename='.basename($file_name)); //文件名
    header('Content-Type: '.$file_headers['Content-Type']); //zip
    header("Content-Transfer-Encoding: binary"); //二进制文件
    header('Content-Length: '. filesize($tmp_dir.$file_name)); //文件大小
    
    $user_agent = $_SERVER["HTTP_USER_AGENT"];
    $encoded_name = rawurlencode($file_name);
    if (preg_match("/Firefox/", $user_agent)) { //火狐浏览器
        header('Content-Disposition: attachment; filename*=utf-8\'\''.$encoded_name);
    } else { // IE, 谷歌浏览器
        header('Content-Disposition: attachment; filename="' . $file_name . '"');
    }
    ob_clean();
    flush();
    @readfile($tmp_dir.$file_name);
    $downloader->deleteDir($tmp_dir);
    
    //文件下载类
    class fileDownloader{
    
        // 下载文件
        // $dir 文件存放地址,绝对路径
        // $urls 文件下载地址
        public function download($dir, $urls = array()){
            if (!file_exists($dir)) {
                mkdir($dir, 0777, true);
            }
            if (empty($urls)) {
                return;
            }
    
            foreach ($urls as $val) {
                $file_name_arr = explode('/', $val); // 使用 / 分隔url
                $file_name = array_pop($file_name_arr); // 弹出数组的最后一个元素,作为文件名
    
                // 如果以linux作为主机,需要将utf文件名转换成GBK文件名
    //                if (PHP_OS != 'WINNT') {
    //                    $file_name = mb_convert_encoding($file_name, 'gbk', 'utf-8'); // 把文件名从utf-8转换为gbk
    //                }
    //            $file_name = mb_convert_encoding($file_name, 'gbk', 'utf-8'); // 把文件名从utf-8转换为gbk
    
                // 下载文件
                $ch = curl_init();
                curl_setopt($ch,CURLOPT_URL,$val);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
                $data = curl_exec($ch);
                error_log(var_export(curl_getinfo($ch), 1));
                curl_close($ch);
                if ($data) {
                    // 保存文件
                    file_put_contents($dir.$file_name, $data);
                }
            }
        }
    
        // 压缩文件
        // $dir 扫描目录
        // $filename 压缩文件名
        public function compress($dir, $filename = false){
            if (!file_exists($dir)) {
                return false;
            }
    
            $file_lists = scandir($dir); // 扫描文件夹
            $file_lists = array_diff($file_lists, ['.', '..']); //去除上级目录和当前目录
            if (empty($file_lists)) {
                return false;
            }
    
            if (!$filename) {
                $filename = time().rand(111, 999).'.zip';
            } else {
                $filename .= '.zip';
            }
    
            $fullname = $dir.$filename; // 带路径的压缩文件名
            if (!file_exists($fullname)) {
                $zip = new ZipArchive();
                if ($zip->open($fullname, ZipArchive::CREATE)==TRUE) {
                    foreach($file_lists as $val){
                        if(file_exists($dir.$val)){
                            $zip->addFile($dir.$val, $val);
                        }
                    }
                    $zip->close();
                }
            }
            return $filename;
        }
    
        // 递归删除文件和文件夹
        // $path 要删除的文件路径
        public function deleteDir($path)
        {
            //如果是目录则继续
            if (is_dir($path)) {
                $file_lists = scandir($path);//扫描一个文件夹内的所有文件夹和文件并返回数组
                foreach ($file_lists as $val) {//排除目录中的.和..
                    if ($val != "." && $val != "..") {//如果是目录则递归子目录,继续操作
                        if (is_dir($path . $val)) {//子目录中操作删除文件夹和文件
                            self::deleteDir($path . $val . '/');//目录清空后删除空文件夹
                            @rmdir($path . $val . '/');
                        } else {//如果是文件直接删除
                            unlink($path . $val);
                        }
                    }
                }
                @rmdir($path);
            }
        }
    }

    以上就是php下载远程文件的源码介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:PHP错误日志和内存查看的方法介绍(代码) 下一篇:PHP简单对称加密算法的介绍(代码示例)
    大前端线上培训班

    相关文章推荐

    • 如何使用.htaccess从URL中删除文件扩展名(.php和.html)• 如何在PHP中压缩目录?(代码示例)• 如何使用PHP为JSON创建数组?• PHP错误日志和内存查看的方法介绍(代码)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网