首页 > 开发 > PHP > 正文

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

2024-05-04 22:01:59
字体:大 中 小
来源:转载
供稿:网友

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表