php下载远程文件的源码是什么

  介绍

这篇文章将为大家详细讲解有关php下载远程文件的源码是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

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

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

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

& lt; php ?   set_time_limit (0);//允许下载的url   $ allowed_url=(   & # 39;& # 39;   & # 39;& # 39;   & # 39;& # 39;];//允许的url//$ file_urls=post (& # 39; file_urls& # 39;);   $ file_urls=& # 39; & # 39;;//远程文件路径      美元file_url_arr=爆炸(& # 39;& # 39;file_urls美元);   (file_url_arr=array_unique美元file_url_arr);//过滤相同的url//foreach (file_url_arr美元美元关键=比;$ val) {//$ url_arr=parse_url (val);//如果(!收取($ url_arr[& # 39;主机# 39;])| | ! in_array (url_arr美元[& # 39;主机# 39;],allowed_url美元)){//设置($ file_url_arr [$ key]);//}//}   如果(空(file_url_arr美元)){   $=输出数组(   & # 39;状态# 39;=比;2,   & # 39;代码# 39;=比;999年,   & # 39;错误# 39;=比;& # 39;未找到合法url # 39;,   );   退出(json_encode(输出)美元);   }      $ download_dir=根强生# 39;下载# 39;.DIRECTORY_SEPARATOR;   如果(! file_exists (download_dir美元))mkdir (download_dir 0777美元,真);   tmp_dir=download_dir.time美元()。兰特(100、999).DIRECTORY_SEPARATOR;//文件临时存放目录      美元下载=new fileDownloader ();      如果(file_url_arr美元,,!空(file_url_arr美元))$下载→下载(tmp_dir, file_url_arr美元);//下载文件      (file_lists=scandir美元tmp_dir);   (file_lists=array_diff美元file_lists[& # 39;强生# 39;& # 39;. . & # 39;]);   $ file_lists=元素($ file_lists);//重置索引   如果(空(file_lists美元)){   $=输出数组(   & # 39;状态# 39;=比;2,   & # 39;代码# 39;=比;999年,   & # 39;错误# 39;=比;& # 39;无下载文件& # 39;,   );   退出(json_encode(输出)美元);   }//如果(count ($ file_lists)比;1){//如果是多个文件就压缩//file_name=美元下载→压缩(tmp_dir, subject_title美元);//其他}{   file_name=file_lists美元[0];//如果是单个文件就直接输出//}      $ file_headers=get_headers (file_urls美元,1);   标题(“cache - control: public");   标题(“内容描述:文件Transfer");//头(& # 39;附加项:附件;文件名=& # 39;.basename (file_name美元));//文件名   头(& # 39;- type: & # 39;。美元file_headers[& # 39;内容类型# 39;]);//邮政编码   标题(“Content-Transfer-Encoding: binary");//二进制文件   头(& # 39;内容长度:& # 39;。文件大小(tmp_dir。file_name美元));//文件大小      美元user_agent=$ _SERVER (“HTTP_USER_AGENT");   (encoded_name=rawurlencode美元file_name);   如果(preg_match (“/Firefox/?美元user_agent)){//火狐浏览器   头(& # 39;附加项:附件;文件名*=utf - 8 \ & # 39; \ & # 39; & # 39; encoded_name美元);   其他}{//即谷歌浏览器   头(& # 39;附加项:附件;文件名=? # 39;。file_name美元。& # 39;“& # 39;);   }   ob_clean ();   冲洗();   @readfile (tmp_dir。file_name美元);   下载器→美元deleteDir ($ tmp_dir);//文件下载类   类fileDownloader {//下载文件//美元dir文件存放地址,绝对路径//$ url文件下载地址   公共函数下载(dir, url=美元数组()){   如果(! file_exists (dir美元)){   mkdir (dir 0777美元,真);   }   如果(空($ url)) {   返回;   }      foreach ($ url美元val) {   $ file_name_arr=爆炸(& # 39;/& # 39;,val美元);//使用/分隔url   (file_name=最后一美元file_name_arr);//弹出数组的最后一个元素,作为文件名//如果以linux作为主机,需要将utf文件名转换成GBK文件名//如果(PHP_OS !=& # 39; WINNT& # 39;) {//file_name=mb_convert_encoding美元($ file_name & # 39; gbk # 39;, & # 39; utf - 8 # 39;);//把文件名从utf - 8转换为gbk//}//file_name=mb_convert_encoding美元($ file_name & # 39; gbk # 39;, & # 39; utf - 8 # 39;);//把文件名从utf - 8转换为gbk//下载文件   $ ch=curl_init ();   curl_setopt ($ ch CURLOPT_URL val美元);   curl_setopt ($ ch CURLOPT_RETURNTRANSFER真实);   curl_setopt (ch美元CURLOPT_CONNECTTIMEOUT 0);   美元$ data=https://www.yisu.com/zixun/curl_exec (ch);   error_log (var_export (curl_getinfo (ch美元),1));   curl_close (ch);   如果(元数据){//保存文件   写入($ dir。file_name美元,美元数据);   }   }   }//压缩文件//美元dir扫描目录//文件名美元压缩文件名   公共函数压缩(dir,文件名美元=false) {   如果(! file_exists (dir美元)){   返回错误;   }      (file_lists=scandir美元dir);//扫描文件夹   (file_lists=array_diff美元file_lists,”。','。');//去除上级目录和当前目录   如果(空(file_lists美元)){   返回错误;   }      如果(! $ filename) {   $ filename=()。兰特(111、999)。“zip”;   其他}{   文件名。美元=皕ip”;   }      美元fullname=dir。美元文件名;//带路径的压缩文件名   如果(! file_exists (fullname美元)){   $ zip=新ZipArchive ();   如果($ zip ->打开(fullname美元,ZipArchive:: CREATE)==TRUE) {   foreach (file_lists val美元美元){   如果(file_exists (dir。瓦尔美元)){   $ zip -> addFile ($ dir。瓦尔,val美元);   }   }   $ zip -> close ();   }   }   返回$文件名;   }//递归删除文件和文件夹//路径美元要删除的文件路径   公共函数deleteDir(路径)   {//如果是目录则继续   如果(is_dir(路径)美元){   (file_lists=scandir美元路径);//扫描一个文件夹内的所有文件夹和文件并返回数组   foreach (file_lists val美元美元){//排除目录中的。和. .   如果(val美元!="。"& & $ val !=" . . "){//如果是目录则递归子目录,继续操作   如果美元(is_dir(路径。美元val)){//子目录中操作删除文件夹和文件   self:: deleteDir(美元)的道路。val美元。'/');//目录清空后删除空文件夹   @rmdir($路径。val美元。'/');   其他}{//如果是文件直接删除   分离($路径。美元val);   }   }   }   @rmdir(路径);   }   }   }

php下载远程文件的源码是什么