介绍
这篇文章将为大家详细讲解有关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下载远程文件的源码是什么