服务器下载文件Http头的设置

原创 2015年11月17日 18:09:23

网站提供下载服务时经常需要实现一个强制下载功能(即强制弹出下载对话框),并且文件名保持和用户之前上传时相同。 效果如下图: Content Disposition

Content-Disposition

使用 HTTP Header 的 Content-Disposition: attachment 可以实现下载时强制弹出下载对话框。

由于HTTP协议规定,通信内容使用US ASCII编码,就是只能使用英文字符集。若要使用其他字符集,必须根据RFC3986使用百分号将字符串编码。

Content-Disposition: attachment; filename=filename.ext
Content-Disposition: attachment; filename*=charset'lang'encoded-filename.ext

如果不进行编码会出现,用户保存文件文件名会是乱码。如下图:

Content Disposition

不过关于Content-Disposition的RFC6266规范是2011年6月才纳入HTTP标准。 浏览器方面我测试了主流浏览器,Firefox 、 Chrome 、 Opera 、 Safari ,都支持新标准规定的 filename,不出意料,万恶的IE并不支持这个规范。不过我还是很吃惊,IE10竟然也不支持filename

按照规范输出Content-Disposition的PHP代码如下:

if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
     header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $originfile ) . '"' );
}
else
{
     header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $originfile ) );
}

注意编码时使用rawurlencode而不是urlencode,二者的区别在于前者把空格编码为%20,而后者是+。在stackoverflow上关于这两个函数有更详细的讨论,PHP - urlencode vs rawurlencode?

Content-Type

浏览器对已知类型的文件(如jpg、pdf、txt等)直接在浏览器内打开,我们通过设置http头中的 Content-Type 来改变浏览器认知的文件类型。 这里把Content-Type 设置为octet-stream,也就是二进制文件流。这样浏览器就会直接打开文件,而不是在浏览器内打开。

Content-Type: application/octet-stream

完整PHP代码

$filename = '中文文件名.txt';
header('Content-Type: application/octet-stream');
if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
     header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $originfile ) . '"' );
}
else
{
     header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $originfile ) );
}

header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Transfer-Encoding: binary");
header('Pragma: public');
header("Content-Length: ".filesize($filename));


常见MIME类型例表:

序号

内容类型

文件扩展名

描述

1

application/msword

doc

Microsoft Word

2

application/octet-stream

dms lha lzh exe class

可执行程序

3

application/pdf

pdf

Adobe Acrobat

4

application/postscript

ai eps ps

PostScript

5

appication/powerpoint

ppt

Microsoft Powerpoint

6

appication/rtf

rtf

rtf 格式

7

appication/x-compress

z

unix 压缩文件

8

application/x-gzip

gz

gzip

9

application/x-gtar

gtar

tar 文档 (gnu 格式 )

10

application/x-shockwave-flash

swf

MacroMedia Flash

11

application/x-tar

tar

tar(4.3BSD)

12

application/zip

zip

winzip

13

audio/basic

au snd

sun/next 声音文件

14

audio/mpeg

mpeg mp2

Mpeg 声音文件

15

audio/x-aiff

mid midi rmf

Midi 格式

16

audio/x-pn-realaudio

ram ra

Real Audio 声音

17

audio/x-pn-realaudio-plugin

rpm

Real Audio 插件

18

audio/x-wav

wav

Microsoft Windows 声音

19

image/cgm

cgm

计算机图形元文件

20

image/gif

gif

COMPUSERVE GIF 图像

21

image/jpeg

jpeg jpg jpe

JPEG 图像

22

image/png

png

PNG 图像

23

 text/html

HTML

 

24

 text/plain

 TXT

 

25

 text/xml 

XML

 

 

26            

 

 text/json  

 json字符串

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

HTTP文件下载原理

于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可: GET /Path/FileName HTTP/1.0Host: www.server.com:80Accept: *...
  • wang664626482
  • wang664626482
  • 2016年09月05日 16:56
  • 939

文件下载原理详解 http协议

最终编辑 lin_chaoqi于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可:      GET /Path/FileName HTTP/1.0Host: www.server....
  • wong_judy
  • wong_judy
  • 2010年08月03日 15:16
  • 17007

socket http文件下载器c语言实现

socket真是一个神奇的东西,可以说是另外一扇大门, 蕴藏着很多有趣的东西, 本文就介绍如何使用c语言使用socket实现一个http文件下载器.下载分为以下几个过程 解析出下载地址中的域名和文件名...
  • xiongyangg
  • xiongyangg
  • 2016年02月29日 18:52
  • 6248

Http下载文件

  • 2014年06月25日 17:54
  • 4KB
  • 下载

http文件下载

  • abel004
  • abel004
  • 2015年07月17日 16:41
  • 206

http大文件下载

1、最常用的下载方式是找到文件下载路径, 直接下载了, 这种直接形式从硬盘下载文件,大文件下载速度比较慢。 2、利用HTTP输出二进制流实现下载文件,速度是够快,不过同样缺陷在于下载大文件时,因...
  • yanqzhi
  • yanqzhi
  • 2017年02月03日 10:40
  • 2124

转载 httpclient 上传、下载文件

转自:http://www.oschina.net/code/snippet_216580_38020 基于HttpClient 4.3.3 的一个上传、下载文件的例子,特转载以供大家学习参考。 ...
  • lianghongge
  • lianghongge
  • 2014年12月24日 10:38
  • 10122

Java Http下载文件到本地

package com.proxy.util;      import java.io.BufferedOutputStream;   import java.io.File;   impor...
  • springyu_cheng
  • springyu_cheng
  • 2016年10月10日 10:18
  • 2206

利用HTTP协议实现文件下载的多线程断点续传

      最近研究了一下关于文件下载的相关内容,觉得还是写些东西记下来比较好。起初只是想研究研究,但后来发现写个可重用性比较高的模块还是很有必要的,我想这也是大多数开发人员的习惯吧。      对于...
  • goodname008
  • goodname008
  • 2006年01月02日 17:03
  • 17935

Java:使用HttpClient进行POST和GET请求以及文件上传和下载

1.HttpClient大家可以先看一下HttpClient的介绍,这篇博文写的还算不错:http://blog.csdn.net/wangpeng047/article/details/196245...
  • NUPTboyZHB
  • NUPTboyZHB
  • 2015年01月14日 23:30
  • 25914
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务器下载文件Http头的设置
举报原因:
原因补充:

(最多只允许输入30个字)