众所周知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请求头实现文件下载相关推荐

  1. http请求头状态码

    1.返回"HTTP Status 415"状态码[表示不支持的媒体类型(Media Type),也就是MIME类型] 如果请求头是Content-type=application/ ...

  2. Content-type的说明即HTTP请求头的类型整理

    浏览器会根据Content-Type来决定如何显示返回的消息体内容,下面与大家分享下Content-type的说明即HTTP请求头的类型,感兴趣的朋友可以参考下哈,希望对大家有所帮助 要学习conte ...

  3. HTPP常用请求头、HTTP响应头、HTTP content-type

    文章目录 请求头 响应头 HTTP content-type 请求头 协议头 说明 Accept 可接受的响应内容类型(Content-Types) Accept-Charset 可接受的字符集 Ac ...

  4. 请求头(request headers)和响应头(response headers)解析

    原文地址:https://www.cnblogs.com/fighter007/p/8445435.html HTTP 中文开发手册:http://www.php.cn/manual/view/355 ...

  5. el upload ajax,Upload 上传 el-upload 上传配置请求头为Content-Type: multipart/form-data

    api接口处添加属性 (标红处) // 校验台账 export const checkEquiment = (data) => { return axios({ url: '/job/equip ...

  6. http 请求头、响应头、请求体的各个属性的含义

    常用标准请求头字段 Accept 设置接受的内容类型 Accept: text/plain Accept-Charset 设置接受的字符编码 Accept-Charset: utf-8 Accept- ...

  7. 阿里云OSS上传文件设置请求头

    之前写过一篇发送文件消息的,原生input上传文件(聊天发送文件消息),这次的需求就是更改上传地址,使用阿里云OSS上传. 如果想了解阿里云对象存储OSS是如何使用的,请看阿里云存储对象OSS使用讲解 ...

  8. http请求头中的content-type 属性

    在HTTP请求中,我们每天都在使用Content-Type来指定不同格式的请求信息,但是却很少有人去全面了解Content-Type中允许的值有多少,因此这里来了解一下Content-Type的可用值 ...

  9. Python爬虫有用的库:fake_useragent,自动生成请求头

    文章目录 前言 fake_useragent 其它错误 参考文章 前言 练习爬虫的很多小伙伴,在进行request请求时,大部分情况下都要添加一个请求头,而最常见的就是添加user-agent,帮助爬 ...

最新文章

  1. 用户空间增加、缩减内存
  2. 悟透LoadRunner - 什么是性能测试?
  3. 关于Window操作系统中对Oracle的性能监控
  4. ubuntu16.04安装curl
  5. sonar-scanner debug 模式设置(sonar-scanner调试)
  6. Java类加载的那些事
  7. 【LeetCode笔记】263. 丑数(Java、迭代)
  8. Java BigInteger类| isProbablePrime()方法与示例
  9. php 立即执行函数,关于javascrip的立即执行函数的解析
  10. java设置界面边框,技术员教你解决Java 添加Word页面边框
  11. 原理简单,但不知道怎么用?一文看懂「同期群模型」
  12. 怒肝三个月啃完这110道面试题,跳槽薪资翻倍
  13. js中in关键字的用法
  14. poj 2385 Apple Catching 经典dp
  15. Illustrator教程,如何在 Illustrator 中创建和应用图案?
  16. 微信抢红包的方案_微信社群运营应该怎么运作?
  17. 2018.12.20 区块链论文翻译
  18. php获取用户手机imei id,获取手机设备信息  IMEI
  19. 瞎聊高速公路与主干道的立交匝道设计
  20. 通报1422人!论文无实质贡献挂名认定为学术不端,科技部发布新规!

热门文章

  1. python拼图游戏代码,OpenCV Python实现拼图小游戏
  2. php小猫咪图床源码V1.8
  3. Rclone for Android – 云服务/网盘文件管理工具 Rclone 的 Android 客户端
  4. 简洁的网页跑丢了动态动画404页面源码
  5. 最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇
  6. Java开发必看JPA概念大全
  7. input 关闭输入法
  8. php 日期时间运算的小结(计算当前时间之后(之前)的时间)
  9. 并查集——食物链(poj1182)
  10. Python深入-Python的内存管理