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

本篇文章给大家带来的内容是关于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);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值