本篇文章给人人带来的内容是关于php下载长途文件的源码引见,有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。
近来碰到下载pdf花样的文件存在题目 下载后看不了另有下载不了的题目
大抵思绪是将文件先从长途下载后 再读取下载到用户当地电脑 再将文件删除 不多说了 直接贴源码
长途文件的定名 最好运用英文数字组合 ,不要用中文定名 总会碰到你想不到的题目
内里也包含紧缩下载 细致 人人看源码 研讨吧
<?php set_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']); //zip header("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下载长途文件的源码引见的细致内容,更多请关注ki4网别的相干文章!