雪飞鸿没好气的说道:“还能去哪,去洗澡,刚才你呕吐的时候,溅到我了,我要去洗洗。”

PHP使用header方式实现文件下载


php文件下载可以使用http的请求头加上php的IO可以实现,很久之前写过这么一个功能,后来代码没了,今天记录一下

1、先看一下一个正常的http请求

HTTP/1.1 200 OK
Server: Tengine
Content-Type: application/octet-stream
Content-Length: 5050697
Connection: keep-alive
Date: Thu, 12 Oct 2017 11:24:46 GMT
Accept-Ranges: bytes
Content-Disposition: attachment; filename=down/20170928/zjbb_2.9.5.apk
Expires: Thu, 12 Oct 2017 11:25:46 GMT
Cache-Control: max-age=60
Via: cache25.l2eu6-1[0,200-0,H], cache16.l2eu6-1[16,0], cache8.cn891[0,200-0,H], cache8.cn891[1,0]
Age: 1733678
X-Cache: HIT TCP_MEM_HIT dirn:6:277104755 mlen:-1
X-Swift-SaveTime: Sat, 14 Oct 2017 00:50:47 GMT
X-Swift-CacheTime: 93312000
Timing-Allow-Origin: *
EagleId: b73d0e1c15095411645886178e

2、一些常见的header功能

 

header("HTTP/1.1 200 OK"); // ok 正常访问
header("HTTP/1.1 404 Not Found"); //通知浏览器 页面不存在
header("HTTP/1.1 301 Moved Permanently"); //设置地址被永久的重定向 301
header("Location: http://www.test.con/"); //跳转到一个新的地址
header("Refresh: 10; url=http://www.test.con/"); //延迟转向 也就是隔几秒跳转
header("X-Powered-By: PHP/7.0.0"); //修改 X-Powered-By信息
header("Content-language: en"); //文档语言
header("Content-Length: 1234"); //设置内容长度
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $time)." GMT"); //告诉浏览器最后一次修改时间
header("HTTP/1.1 304 Not Modified"); //告诉浏览器文档内容没有发生改变
 
###内容类型###
header("Content-Type: text/html; charset=utf-8"); //网页编码
header("Content-Type: text/plain"); //纯文本格式
header("Content-Type: image/jpeg"); //JPG、JPEG 
header("Content-Type: application/zip"); // ZIP文件
header("Content-Type: application/pdf"); // PDF文件
header("Content-Type: audio/mpeg"); // 音频文件 
header("Content-type: text/css"); //css文件
header("Content-type: text/javascript"); //js文件
header("Content-type: application/json"); //json
header("Content-type: application/pdf"); //pdf
header("Content-type: text/xml"); //xml
header("Content-Type: application/x-shockw**e-flash"); //Flash动画
 
######
 
###声明一个下载的文件###
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="ITblog.zip"");
header("Content-Transfer-Encoding: binary");
readfile("test.zip");
######
 
###对当前文档禁用缓存###
header("Cache-Control: no-cache, no-store, max-age=0, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
######
 
###显示一个需要验证的登陆对话框### 
header("HTTP/1.1 401 Unauthorized"); 
header("WWW-Authenticate: Basic realm="Top Secret""); 
######
 
 
###声明一个需要下载的xls文件###
header("Content-Disposition: attachment; filename=abc.xlsx");
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Length: ".filesize("./test.xls")); 
header("Content-Transfer-Encoding: binary"); 
header("Cache-Control: must-revalidate"); 
header("Pragma: public"); 
readfile("./test.xls"); 

3、看下下载所要用的的请求头

 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-Length:表示接收的文件大小,php文件下载需要告诉浏览器下载的文件有多大

  • Content-Disposition:附件只需要把文件名给过去就可以,这个名称就是下载时显示的文件名称

4、php的文件操作出现的比较早,文件名是中文的时候需要注意转码

$filename=iconv("UTF-8","GB2312",$filename);

5、php的文件下载机制是首先nginx把文件信息读入服务器内存,然后使用请求头把文件二进制信息通过浏览器传给客户端

feof用来判断文件是否已经读到了末尾,fread用来把文件读入缓冲区,缓冲区的大小是1024,一边读取一边把数据输出到浏览器。为了下载的安全性每次读数据都进行字节的计数。文件读取完毕后关闭输入流

注意:

a、如果运行的过程中出现问题,可以清空(擦掉)输出缓冲区,使用下面的代码即可

ob_clean();

b、很多人喜欢用readfile,如果是大文件,可能会有问题

完整代码

<?php
    ob_clean();
    $action = $_GET["action"];
    $filename = base64_decode($action);//传的参数encode了
    $filepath = "/data/www/www.test.com/".$filename;

    if(!file_exists($filepath)){
        exit;
    }

    $fp=fopen($filepath,"r");
    $filesize=filesize($filepath);

    header("Content-type:application/octet-stream");
    header("Accept-Ranges:bytes");
    header("Accept-Length:".$filesize);
    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);

?>

 

 

当前文章:http://hnhdqp.com/51939.html

发布时间:2018-09-26 19:25:20

天9平台娱乐 壹518娱乐 澳门九五至尊娱乐 橙天嘉禾娱乐 澳门金沙城线上娱乐 澳门皇马平台娱乐 永利娱乐免费送53元现金 注册就送28无需申请 重庆时时彩后三直选 重庆时时彩合尾

编辑:顺建密

相关新闻

榆林现代农业科技示范区晋升为国家农业科技园区

2018-09-26 10:10:34

宜宾窗诿新能源有限公司

娱乐化的QQ口令红包,抢占年轻群体

2018-09-26 13:59:46

明港胸宗电子科技有限公司

靖边县妇幼保健院医疗服务队义诊活动走进王渠则镇

2018-09-26 03:53:16

吉安孜谠矣有限公司

一家四口吃早餐凭空消失 疑遭外星人劫持

2018-09-26 16:32:32

改则旧舱朴金融集团

热门推荐

  • 仅仅一天,苹果、谷歌、微软等5家公司市值增近2000亿美元
  • 防盗版or割韭菜?当区块链遇见电影,它既能做好事也能作恶
  • 送给妈妈的好礼:御见花卉康乃馨小雏菊混搭鲜花29.8元(20元券)
  • spark头脑镜像
  • 从苹果财报看到了iPhone X的下半场
  • 贵州:企业同心 致富同行 “千企帮千村”精准扶贫
  • 江南嘉捷今日复牌:开盘涨6.59%
  • 360手机李开新:明年业绩增长超50%,未来出货超1000万
  • CF手游“吃鸡”模式正式上线:能骑摩拜还能飙悍马
  • “慰安妇”档案申遗遗憾落选 韩媒:日本政府全力阻挠
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:微信老虎机活动 age of empire 3 下载
  • AG网络现金网游戏 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • mg5525ncom mg老虎机免费送现金 pt白菜游戏 pt老虎机玩家论坛