您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

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

2024/3/28 23:33:05发布8次查看
本篇文章给大家带来的内容是关于php下载远程文件的源码介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
最近遇到下载pdf格式的文件存在问题 下载后看不了还有下载不了的问题  
大致思路是将文件先从远程下载后  再读取下载到用户本地电脑 再将文件删除 不多说了 直接贴源码
远程文件的命名 最好使用英文数字组合 ,不要用中文命名 总会遇到你想不到的问题
里面也包括压缩下载 具体 大家看源码 研究吧
<?phpset_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']); //zipheader("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下载远程文件的源码介绍的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录