php使用http请求头实现文件下载
众所周知php对http协议的依赖特别强,像java或者asp.net在某些情况下可以不依赖http例如asp.net的winform,对php来说文件下载可以使用http的请求头加上php的IO就可以实现了
1.先来看下下载所要用的的请求头
header("Content-type:application/octet-stream");header("Accept-Ranges:bytes");header("Accept-Length:".$file_Size);header("Content-Disposition: attachment; filename=".$filename);
content-type就不解释了,Accept-Ranges表示接收数据的类型或者范围,图片属于二进制的东西所以需要使用字节的方式传输,Accept-Lenght表示接收的大小,php文件下载需要告诉浏览器下载的文件有多大,最后一个是附件只需要把文件名给过去就可以,这个名称就是下载时显示的文件名称。
2.php的文件操作出现的比较早,文件名是中文的时候需要注意转码
$filename=iconv("UTF-8","GB2312",$filename);
3.php的文件下载机制是首先apcahe把文件信息读入服务器内存,然后使用请求头把文件二进制信息通过浏览器传给客户端
//判断路径是否存在if(!file_exists($filepath)){echo "文件不存在";return;}$fp=fopen($filepath,"r");//取得文件大小$file_Size=filesize($filepath);header("Content-type:application/octet-stream");header("Accept-Ranges:bytes");header("Accept-Length:".$file_Size);header("Content-Disposition: attachment; filename=".$filename);$buffer=1024;$buffer_count=0;while(!feof($fp)&&$file_Size-$buffer_count>0){$data=fread($fp,$buffer);$buffer_count+=$buffer;echo $data;}fclose($fp);
feof用来判断文件是否已经读到了末尾,fread用来把文件读入缓冲区,缓冲区的大小是1024,一边读取一边把数据输出到浏览器。为了下载的安全性每次读数据都进行字节的计数。文件读取完毕后关闭输入流
3.上面的代码有的时候不好使,可以清空(擦掉)输出缓冲区,使用下面的代码即可
ob_clean();
来看下运行效果图
下载之后文件也没有任何的问题
下面是全部代码
<?phpfunction downloadFile($name){ob_clean();$filename=$name;$filename=iconv("UTF-8","GB2312",$filename);$filepath="E:\\otherphp\\download\\download\\".$filename;//判断路径是否存在if(!file_exists($filepath)){echo "文件不存在";return;}$fp=fopen($filepath,"r");//取得文件大小$file_Size=filesize($filepath);header("Content-type:application/octet-stream");header("Accept-Ranges:bytes");header("Accept-Length:".$file_Size);header("Content-Disposition: attachment; filename=".$filename);$buffer=1024;$buffer_count=0;while(!feof($fp)&&$file_Size-$buffer_count>0){$data=fread($fp,$buffer);$buffer_count+=$buffer;echo $data;}fclose($fp);}downloadFile("桌面截图.png");
?>
php使用http请求头实现文件下载相关推荐
- http请求头状态码
1.返回"HTTP Status 415"状态码[表示不支持的媒体类型(Media Type),也就是MIME类型] 如果请求头是Content-type=application/ ...
- Content-type的说明即HTTP请求头的类型整理
浏览器会根据Content-Type来决定如何显示返回的消息体内容,下面与大家分享下Content-type的说明即HTTP请求头的类型,感兴趣的朋友可以参考下哈,希望对大家有所帮助 要学习conte ...
- HTPP常用请求头、HTTP响应头、HTTP content-type
文章目录 请求头 响应头 HTTP content-type 请求头 协议头 说明 Accept 可接受的响应内容类型(Content-Types) Accept-Charset 可接受的字符集 Ac ...
- 请求头(request headers)和响应头(response headers)解析
原文地址:https://www.cnblogs.com/fighter007/p/8445435.html HTTP 中文开发手册:http://www.php.cn/manual/view/355 ...
- el upload ajax,Upload 上传 el-upload 上传配置请求头为Content-Type: multipart/form-data
api接口处添加属性 (标红处) // 校验台账 export const checkEquiment = (data) => { return axios({ url: '/job/equip ...
- http 请求头、响应头、请求体的各个属性的含义
常用标准请求头字段 Accept 设置接受的内容类型 Accept: text/plain Accept-Charset 设置接受的字符编码 Accept-Charset: utf-8 Accept- ...
- 阿里云OSS上传文件设置请求头
之前写过一篇发送文件消息的,原生input上传文件(聊天发送文件消息),这次的需求就是更改上传地址,使用阿里云OSS上传. 如果想了解阿里云对象存储OSS是如何使用的,请看阿里云存储对象OSS使用讲解 ...
- http请求头中的content-type 属性
在HTTP请求中,我们每天都在使用Content-Type来指定不同格式的请求信息,但是却很少有人去全面了解Content-Type中允许的值有多少,因此这里来了解一下Content-Type的可用值 ...
- Python爬虫有用的库:fake_useragent,自动生成请求头
文章目录 前言 fake_useragent 其它错误 参考文章 前言 练习爬虫的很多小伙伴,在进行request请求时,大部分情况下都要添加一个请求头,而最常见的就是添加user-agent,帮助爬 ...
最新文章
- 用户空间增加、缩减内存
- 悟透LoadRunner - 什么是性能测试?
- 关于Window操作系统中对Oracle的性能监控
- ubuntu16.04安装curl
- sonar-scanner debug 模式设置(sonar-scanner调试)
- Java类加载的那些事
- 【LeetCode笔记】263. 丑数(Java、迭代)
- Java BigInteger类| isProbablePrime()方法与示例
- php 立即执行函数,关于javascrip的立即执行函数的解析
- java设置界面边框,技术员教你解决Java 添加Word页面边框
- 原理简单,但不知道怎么用?一文看懂「同期群模型」
- 怒肝三个月啃完这110道面试题,跳槽薪资翻倍
- js中in关键字的用法
- poj 2385 Apple Catching 经典dp
- Illustrator教程,如何在 Illustrator 中创建和应用图案?
- 微信抢红包的方案_微信社群运营应该怎么运作?
- 2018.12.20 区块链论文翻译
- php获取用户手机imei id,获取手机设备信息 IMEI
- 瞎聊高速公路与主干道的立交匝道设计
- 通报1422人!论文无实质贡献挂名认定为学术不端,科技部发布新规!