本篇文章給大家帶來的內容是關於php下載遠程文件的源碼介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
最近遇到下載pdf格式的文件存在問題 下載後看不了還有下載不了的問題
大致思路是將文件先從遠程下載後 再讀取下載到用戶本地電腦 再將文件刪除 不多說了 直接貼源碼
遠程文件的命名 最好使用英文數字組合 ,不要用中文命名 總會遇到你想不到的問題
裡面也包括壓縮下載 具體 大家看源碼 研究吧
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下載遠程文件的源碼介紹的詳細內容,更多請關注其它相關文章!
更多技巧請《轉發 + 關注》哦!