当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2020-02-04 16:45:44 浏览: 评论:0 

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

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

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

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

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

  1. <?php 
  2.  
  3. set_time_limit(0); 
  4.  
  5. //允许下载的url 
  6.  
  7. $allowed_url = [ 
  8.  
  9.     ''
  10.  
  11.     ''
  12.  
  13.     '']; // 允许的url 
  14.  
  15. //$file_urls = post('file_urls'); 
  16.  
  17. $file_urls = '';//远程文件路径 
  18.  
  19.  
  20.  
  21. $file_url_arr = explode(','$file_urls); 
  22.  
  23. $file_url_arr = array_unique($file_url_arr); // 过滤相同url 
  24.  
  25.  
  26.  
  27. //foreach ($file_url_arr as $key => $val) { 
  28.  
  29. //    $url_arr = parse_url($val); 
  30.  
  31. //    if (!isset($url_arr['host']) || !in_array($url_arr['host'], $allowed_url)) { 
  32.  
  33. //        unset($file_url_arr[$key]); 
  34.  
  35. //    } 
  36.  
  37. //} 
  38.  
  39. if (emptyempty($file_url_arr)) { 
  40.  
  41.     $output = array
  42.  
  43.         'status' => 2, 
  44.  
  45.         'code' => 999, 
  46.  
  47.         'error' => '未找到合法url'
  48.  
  49.     ); 
  50.  
  51.     exit(json_encode($output)); 
  52.  
  53.  
  54.  
  55.  
  56. $download_dir = ROOT.'download'.DIRECTORY_SEPARATOR; 
  57.  
  58. if(!file_exists($download_dir)) mkdir($download_dir, 0777, true); 
  59.  
  60. $tmp_dir = $download_dir.time().rand(100, 999).DIRECTORY_SEPARATOR; // 文件临时存放目录 
  61.  
  62.  
  63.  
  64. $downloader = new fileDownloader(); 
  65.  
  66.  
  67.  
  68. if($file_url_arr && !emptyempty($file_url_arr)) $downloader->download($tmp_dir$file_url_arr); // 下载文件 
  69.  
  70.  
  71.  
  72. $file_lists = scandir($tmp_dir); 
  73.  
  74. $file_lists = array_diff($file_lists, ['.''..']); 
  75.  
  76. $file_lists = array_values($file_lists); // 重置索引 
  77.  
  78. if(emptyempty($file_lists)){ 
  79.  
  80.     $output = array
  81.  
  82.         'status' => 2, 
  83.  
  84.         'code' => 999, 
  85.  
  86.         'error' => '无下载文件'
  87.  
  88.     ); 
  89.  
  90.     exit(json_encode($output)); 
  91.  
  92.  
  93.  
  94.  
  95. //if (count($file_lists) > 1) { // 如果是多个文件就压缩 
  96.  
  97. //    $file_name = $downloader->compress($tmp_dir, $subject_title); 
  98.  
  99. //} else { 
  100.  
  101.     $file_name = $file_lists[0]; // 如果是单个文件就直接输出 
  102.  
  103. //} 
  104.  
  105.  
  106.  
  107. $file_headers = get_headers($file_urls, 1); 
  108.  
  109. header("Cache-Control: public"); 
  110.  
  111. header("Content-Description: File Transfer"); 
  112.  
  113. //header('Content-disposition: attachment; filename='.basename($file_name)); //文件名 
  114.  
  115. header('Content-Type: '.$file_headers['Content-Type']); //zip 
  116.  
  117. header("Content-Transfer-Encoding: binary"); //二进制文件 
  118.  
  119. header('Content-Length: 'filesize($tmp_dir.$file_name)); //文件大小 
  120.  
  121.  
  122.  
  123. $user_agent = $_SERVER["HTTP_USER_AGENT"]; 
  124.  
  125. $encoded_name = rawurlencode($file_name); 
  126.  
  127. if (preg_match("/Firefox/"$user_agent)) { //火狐浏览器 
  128.  
  129.     header('Content-Disposition: attachment; filename*=utf-8\'\''.$encoded_name); 
  130.  
  131. else { // IE, 谷歌浏览器 
  132.  
  133.     header('Content-Disposition: attachment; filename="' . $file_name . '"'); 
  134.  
  135.  
  136. ob_clean(); 
  137.  
  138. flush(); 
  139.  
  140. @readfile($tmp_dir.$file_name); 
  141.  
  142. $downloader->deleteDir($tmp_dir); 
  143.  
  144.  
  145.  
  146. //文件下载类 
  147.  
  148. class fileDownloader{ 
  149.  
  150.  
  151.  
  152.     // 下载文件 
  153.  
  154.     // $dir 文件存放地址,绝对路径 
  155.  
  156.     // $urls 文件下载地址 
  157.  
  158.     public function download($dir$urls = array()){ 
  159.  
  160.         if (!file_exists($dir)) { 
  161.  
  162.             mkdir($dir, 0777, true); 
  163.  
  164.         } 
  165.  
  166.         if (emptyempty($urls)) { 
  167.  
  168.             return
  169.  
  170.         } 
  171.  
  172.  
  173.  
  174.         foreach ($urls as $val) { 
  175.  
  176.             $file_name_arr = explode('/'$val); // 使用 / 分隔url 
  177.  
  178.             $file_name = array_pop($file_name_arr); // 弹出数组的最后一个元素,作为文件名 
  179.  
  180.  
  181.  
  182.             // 如果以linux作为主机,需要将utf文件名转换成GBK文件名 
  183.  
  184. //                if (PHP_OS != 'WINNT') { 
  185.  
  186. //                    $file_name = mb_convert_encoding($file_name, 'gbk', 'utf-8'); // 把文件名从utf-8转换为gbk 
  187.  
  188. //                } 
  189.  
  190. //            $file_name = mb_convert_encoding($file_name, 'gbk', 'utf-8'); // 把文件名从utf-8转换为gbk 
  191.  
  192.  
  193.  
  194.             // 下载文件 
  195.  
  196.             $ch = curl_init(); 
  197.  
  198.             curl_setopt($ch,CURLOPT_URL,$val); 
  199.  
  200.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
  201.  
  202.             curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
  203.  
  204.             $data = curl_exec($ch); 
  205.  
  206.             error_log(var_export(curl_getinfo($ch), 1)); 
  207.  
  208.             curl_close($ch); 
  209.  
  210.             if ($data) { 
  211.  
  212.                 // 保存文件 
  213.  
  214.                 file_put_contents($dir.$file_name$data); 
  215.  
  216.             } 
  217.  
  218.         } 
  219.  
  220.     } 
  221.  
  222.  
  223.  
  224.     // 压缩文件 
  225.  
  226.     // $dir 扫描目录 
  227.  
  228.     // $filename 压缩文件名 
  229.  
  230.     public function compress($dir$filename = false){ 
  231.  
  232.         if (!file_exists($dir)) { 
  233.  
  234.             return false; 
  235.  
  236.         } 
  237.  
  238.  
  239.  
  240.         $file_lists = scandir($dir); // 扫描文件夹 
  241.  
  242.         $file_lists = array_diff($file_lists, ['.''..']); //去除上级目录和当前目录 
  243.  
  244.         if (emptyempty($file_lists)) { 
  245.  
  246.             return false; 
  247.  
  248.         } 
  249.  
  250.  
  251.  
  252.         if (!$filename) { 
  253.  
  254.             $filename = time().rand(111, 999).'.zip'
  255.  
  256.         } else { 
  257.  
  258.             $filename .= '.zip'
  259.  
  260.         } 
  261.  
  262.  
  263.  
  264.         $fullname = $dir.$filename// 带路径的压缩文件名 
  265.  
  266.         if (!file_exists($fullname)) { 
  267.  
  268.             $zip = new ZipArchive(); 
  269.  
  270.             if ($zip->open($fullname, ZipArchive::CREATE)==TRUE) { 
  271.  
  272.                 foreach($file_lists as $val){ 
  273.  
  274.                     if(file_exists($dir.$val)){ 
  275.  
  276.                         $zip->addFile($dir.$val$val); 
  277.  
  278.                     } 
  279.  
  280.                 } 
  281.  
  282.                 $zip->close(); 
  283.  
  284.             } 
  285.  
  286.         } 
  287.  
  288.         return $filename
  289.  
  290.     } 
  291.  
  292.  
  293.  
  294.     // 递归删除文件和文件夹 
  295.  
  296.     // $path 要删除的文件路径 
  297.  
  298.     public function deleteDir($path
  299.  
  300.     { 
  301.  
  302.         //如果是目录则继续 
  303.  
  304.         if (is_dir($path)) { 
  305.  
  306.             $file_lists = scandir($path);//扫描一个文件夹内的所有文件夹和文件并返回数组 
  307.  
  308.             foreach ($file_lists as $val) {//排除目录中的.和.. 
  309.  
  310.                 if ($val != "." && $val != "..") {//如果是目录则递归子目录,继续操作 
  311.  
  312.                     if (is_dir($path . $val)) {//子目录中操作删除文件夹和文件 
  313.  
  314.                         self::deleteDir($path . $val . '/');//目录清空后删除空文件夹 
  315.  
  316.                         @rmdir($path . $val . '/'); 
  317.  
  318.                     } else {//如果是文件直接删除 
  319.  
  320.                         unlink($path . $val); 
  321.  
  322.                     } 
  323.  
  324.                 } 
  325.  
  326.             } 
  327.  
  328.             @rmdir($path); 
  329.  
  330.         } 
  331.  
  332.     } 
  333.  

以上就是php下载远程文件的源码介绍的详细内容。

Tags: php下载远程文件

分享到: