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();
来看下运行效果图
下载之后文件也没有任何的问题
下面是全部代码
<?php
function 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请求头实现文件下载的更多相关文章
- iOS开发——网络篇——文件下载(NSMutableData、NSFileHandle、NSOutputStream)和上传、压缩和解压(三方框架ZipArchive),请求头和请求体格式,断点续传Range
一.小文件下载 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion ...
- 原生js实现文件下载并设置请求头header
原生js实现文件下载并设置请求头header const token="自行定义";//如果有 /** * 向指定路径发送下载请求 * @param{String} url 请求路 ...
- 前端必备HTTP技能之HTTP请求头响应头中常用字段详解(转)
作为一名前端开发人员,肯定少不了要和网络打交道,因为要从服务器端拉取数据,从服务端获取数据最常用的方式还是通过HTTP请求.给服务器发请求的时候有请求头,接受服务器响应的时候有响应头,客户端和服务器端 ...
- Http消息头中常用的请求头和响应头
作为Web开发对常用http的请求头和响应头熟悉了解一下还是很有必要的.比如请求头中Content-type指定了请求的内容,若类型是application/x-www-form-urlencoded ...
- 请求头(request headers)和响应头(response headers)解析
*****************请求头(request headers)***************** POST /user/signin HTTP/1.1 --请求方式 文件名 http ...
- HTTP常用标准请求头字段
常用标准请求头字段 Accept 设置接受的内容类型 Accept: text/plain Accept-Charset 设置接受的字符编码 Accept-Charset: utf-8 Accept- ...
- Zuul 修改 请求头、响应头 (死磕)
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...
- Http 请求头 响应体 详解
Referrer Policy 是什么? 我们知道,在页面引入图片.JS 等资源,或者从一个页面跳到另一个页面,都会产生新的 HTTP 请求, 浏览器一般都会给这些请求头加上表示来源的 Referre ...
- http请求头中的content-type属性
在HTTP请求中,我们每天都在使用Content-Type来指定不同格式的请求信息,但是却很少有人去全面了解Content-Type中允许的值有多少,因此这里来了解一下Content-Type的可用值 ...
随机推荐
- Collections.sort方法对list排序的两种方式
Collections.sort( )分为两部分,一部分为排序规则,一部分为排序算法 . 规则用来判断对象,算法则考虑如何进行排序 对于自定义对象,sort()不知道规则,所以无法比较,这种情况下一定 ...
- js打印
js打印,其实是打印当前页面的内容,是调用 系统的js方法,来弹出 打印设置窗口,用法很简单. window.print()就行,有的考虑到 浏览器兼容性问题,会用到document.execComm ...
- hdu1200(来来回回串起来)
Problem Description Mo and Larry have devised a way of encrypting messages. They first decide secret ...
- 【每日一摩斯】-Troubleshooting: High CPU Utilization (164768.1) - 系列5
Oracle(用户)进程 以下这些操作都是需要消耗大量CPU资源的:解析大型查询,存储过程编译或执行,空间管理和排序. 下面这几篇文章可以帮助采集关于使用高CPU资源的进程的更多信息: Note:35 ...
- jquery mobile自己定义webapp开发实例(一)——前言篇
用jquery mobile做了一段时间的webapp开发,准备用自己的一个小demo做一个模块化的分享 点击demo演示 手机演示二维码: 此demo已经是比較老的版本号,用户体验流畅度确实还存在非 ...
- IE Jquery中拒绝訪问的处理方法
多人合作开发一个站点过程中,为便于开发,将一些公共文件如js,css,images放在外网上,各自链接这类文件以供使用.本地測试时网页的一些JS代码在IE8,IE6中会停止运行,并报某个js文件拒绝訪 ...
- asp.net2.0安全性(1)--用户角色篇(类)--转载来自车老师
Membership.MembershipUser和Roles类 用户与角色管理在asp.net2.0中是通过Membership和Roles两个类来实现的. Membership:用户成员账号管理, ...
- (摘录)MSMQ的简单介绍
MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...
- Qt exe图标
1.首先准备一张ico照片,也可以通过http://www.ico.la/生成: 2.把ico照片拷贝到项目工程下,比如:“pic.ico” 3.在工程下,创建一个文件“myapp.rc”,用txt打 ...
- vld(Visual Leak Detector) 内存泄露检测工具
初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...