header php下载文件很小,PHP通过header方式下载文件教程

news/2024/7/7 19:27:16 标签: header php下载文件很小

PHP通过header方式下载文件时,不能使用ajax方式提交,该方式会将header结果返回给ajax

(1) 在下载大文件的时候,通常需要很长的时间,PHP有默认执行时间,一般是30s,超过该时间,就是下载失败,所以需要设置一下超时时间`set_time_limit(0);`

该语句说明函数执行不设置超时时间。另一个需要设置的就是内存使用,设置`ini_set('memory_limit', '128M');`即可。

(2) 对于下载文件的文件名称,下载下来可能会出现乱码,当然,这种情况出现在文件名包含中文或者特殊字符的情况下,此时,可以设置一下header:$contentDispositionField = 'Content-Disposition: attachment; '

. sprintf('filename="%s"; ', basename($file))

. sprintf("filename*=utf-8''%s", basename($file));

header($contentDispositionField);

(3)下载buffer大小,这个可以根据服务器带宽设置,一般4096就可以

(4)下载时,可以在echo buffer之后设置sleep(1)让程序休眠

(5)在设置header之前,ob_clean()一下,清除缓存区内容

1.强制下载本地文件function forceDownload($file = '')

{

set_time_limit(0); //超时设置

ini_set('memory_limit', '128M'); //内存大小设置

ob_clean();

header("Pragma: public");

header("Expires: 0");

header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

header("Content-Type: application/force-download");

header("Content-Type: application/octet-stream");

header("Content-Type: application/download");

$contentDispositionField = 'Content-Disposition: attachment; '

. sprintf('filename="%s"; ', basename($file))

. sprintf("filename*=utf-8''%s", basename($file)); //处理文件名称

header($contentDispositionField);

header("Content-Transfer-Encoding: binary");

header("Content-Length: " . filesize($file));

$read_buffer = 4096; //设置buffer大小

$handle = fopen($file, 'rb');

//总的缓冲的字节数

$sum_buffer = 0;

//只要没到文件尾,就一直读取

while (!feof($handle) && $sum_buffer < filesize($file)) {

echo fread($handle, $read_buffer);

$sum_buffer = $read_buffer;

}

//关闭句柄

fclose($handle);

exit;

}

2.限制下载速率/**

* @param $localFile 本地文件

* @param $saveFileName 另存文件名

* @param $downloadRate 下载速率

*/

function download_with_limitRate($localFile = '',$saveFileName = '',$downloadRate = 20.5)

{

if(file_exists($localFile) && is_file($localFile)) {

ob_clean();

header('Cache-control: private');

header('Content-Type: application/octet-stream');

header('Content-Length: '.filesize($localFile));

header('Content-Disposition: filename='.$saveFileName);

flush();

// 打开文件流

$file = fopen($localFile, "r");

while(!feof($file)) {

// 发送当前块到浏览器

print fread($file, round($downloadRate * 1024));

// 输出到浏览器

flush();

// sleep one second

sleep(1);

}

//关闭文件流

fclose($file);}

else {

die('Error: The file '.$localFile.' does not exist!');

}

}

3.下载网络文件function downloadFromUrl($url = '', $savePath = 'uploads/')

{

set_time_limit(0);

ini_set('max_execution_time', '0');

$pi = pathinfo($url);

$ext = $pi['extension'];

$name = $pi['filename'];

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_HEADER, false);

curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);

curl_setopt($ch, CURLOPT_AUTOREFERER, true);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$opt = curl_exec($ch);

curl_close($ch);

$saveFile = $name . '.' . $ext;

if (preg_match("/[^0-9a-z._-]/i", $saveFile)) {

$saveFile = $savePath . '/' . md5(microtime(true)) . '.' . $ext;

} else {

$saveFile = $savePath . '/' . $name . '.' . $ext;

}

$handle = fopen($saveFile, 'wb');

if(fwrite($handle, $opt)){

echo 'download success';

}

fclose($handle);

exit;

}

4.获取网络文件大小function remote_filesize($url, $user = "", $pw = "")

{

ob_start();

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_HEADER, 1);

curl_setopt($ch, CURLOPT_NOBODY, 1);

if (!empty($user) && !empty($pw)) {

$headers = array('Authorization: Basic ' . base64_encode("$user:$pw"));

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

}

curl_exec($ch);

curl_close($ch);

$head = ob_get_contents();

ob_end_clean();

$regex = '/Content-Length:\s([0-9]. ?)\s/';

preg_match($regex, $head, $matches);

return isset($matches[1]) ? $matches[1] : "unknown";

}

总结:

1.通过header方式下载一定不能通过ajax方式请求

2.设置超时时间

3.设置memory_limit

4.在header之前ob_clean()

5.设置buffer大小

6.可以设置sleep()减轻内存压力


http://www.niftyadmin.cn/n/1124561.html

相关文章

嵌入式软件的基本测试方法

嵌入式软件的基本测试方法作者:佚名 出处:互连网 摘要&#xff1a;嵌入式软件的基本测试方法随着制造行业的再一次崛起&#xff0c;嵌入式软件目前在软件行业中越来越多&#xff0c;2004年软件行业最火爆的三个项目是&#xff1a;嵌入式开发&#xff0c;软件培训以及软件外…

html实践——IFE task 01

任务描述 原链接&#xff1a;http://ife.baidu.com/task/detail?taskId1 任务目的 了解HTML的定义、概念、发展简史掌握常用HTML标签的含义、用法能够基于设计稿来合理规划HTML文档结构理解语义化&#xff0c;合理地使用HTML标签来构建页面任务描述 参考示例图&#xff08;点击…

解决xp下iis500错误的一个方法

解决xp下IIS 服务器无法加载应用程序 /LM/W3SVC/1/ROOT。错误是 没有注册类别 现象&#xff1a; 浏览ASP页面提示 500内部错误 事件查看器中&#xff1a; [1]&#xff1a; 服务器无法加载应用程序 /LM/W3SVC/1/ROOT。错误是 没有注册类别。 …

微信接口(一)创建菜单自动回复

刚划拉完微信。做一个笔记这里的数据是写死的&#xff0c;还有一份是通过查询数据库进行自动回复&#xff0c;自定义菜单设置的。不过因为使用到数据库&#xff0c;最好在网站后台吧微信平台开发集成进去。所以代码较多就先不放了。有问题的地方请留言&#xff0c;我也学习一下…

CBWFQ

为f0/0进入的流量&#xff0c;分配4M带宽送出到f0/1-------f0/0--R1---f0/1-----------> ------>R1:ip cefclass-map match-all bb2inmatch input-interface f0/0policy-map limit4mclass bb2inpolice 4000000 750000 1500000 conform-action transmit exce…

在ASP.NET中支持断点续传下载大文件(ZT)

IE的自带下载功能中没有断点续传功能&#xff0c;要实现断点续传功能&#xff0c;需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag 客户端每次提交下载请求时&#xff0c;服务端都要添加这两个响应头&#xff0c;以保证客户端…

Unix整理笔记-超级无敌常用命令杂谈1-里程碑M6

1 Unix命令可以分成两部分&#xff1a;命令本身和追加给它的参数。在使用一个命令时&#xff0c;必须了解该命令的默认行为。 2 无论一个命令的参数是合并还是独立添加&#xff0c;该命令都产生相同的输出。 3 man,info,apropos 帮助命令 4 apropos检查是否安装了某个软件包&am…

windows命令行下用netsh实现端口转发(端口映射)

为什么80%的码农都做不了架构师&#xff1f;>>> 微软Windows的netsh是一个命令行脚本实用工具。使用netsh工具 &#xff0c;可以查看或更改本地计算机或远程计算机的网络配置。不仅可以在本地计算机上运行这些命令&#xff0c;而且可以在网络上的远程计算机上运行。…