让浏览器下载文件http头部
网站提供下载服务时经常需要实现一个强制下载功能(即强制弹出下载对话框),并且文件名保持和用户之前上传时相同。 效果如下图: 
Content-Disposition
使用 HTTP Header 的 Content-Disposition: attachment 可以实现下载时强制弹出下载对话框。
由于HTTP协议规定,通信内容使用US ASCII编码,就是只能使用英文字符集。若要使用其他字符集,必须根据RFC3986使用百分号将字符串编码。
Content-Disposition: attachment; filename=filename.extContent-Disposition: attachment; filename*=charset'lang'encoded-filename.ext
如果不进行编码会出现,用户保存文件文件名会是乱码。如下图:

不过关于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 |
|
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头部的更多相关文章
- Microsoft Edge浏览器下载文件乱码修复方法(二)
之前有写过"Microsoft Edge浏览器下载文件乱码修复方法",发现很多情况下下载文件乱码问题还是存在,这里对之前内容做简单补充,希望可以帮到大家. 方法二: 默认如果提示下 ...
- asp.net 浏览器下载文件的四种方式
// 方法一:TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) { Response.ContentT ...
- 火狐浏览器下载文件中文乱码,文件名中的空格变加号("+")的问题
解决一下问题: 1.火狐浏览器下载文件,中文变乱码 2.IE浏览器下载文件,丢失文件扩展名或强制扩展名为".txt" 3.浏览器下载文件,文件名中的空格变成加号("+&q ...
- 在Linux终端使用W3M浏览器下载文件
在Linux终端使用W3M浏览器下载文件 W3M 是3个基于Linux系统命令行的WEB网站浏览工具(w3m/Links/Lynx) 对于需要验证cookie 和来源的页面,比如163的超大附件,直接 ...
- IE浏览器下载文件保存时提示:“你没有权限在此位置中保存文件”解决办法
E浏览器下载文件保存时提示 解决办法: 1.Win + R,打开运行命令,输入gpedit.msc,如图所示 2.打开计算机本地组策略编辑器:选择计算机配置-windows设置-安全设置-本地策略-安 ...
- response没有实现跳转,而是提示浏览器下载文件
问题简述: web项目中,response没能实现重定向跳转网页,而是通知浏览器下载文件. 代码如下: response.getWriter().write("<h1 style='c ...
- 解决PHP在IE浏览器下载文件,中文文件名乱码问题
前提:我们网站所有文件全部使用的是UTF-8 NO BOM的编码方式 1.找测试重现.360浏览器下载的呵呵,果然文件名是乱码.再请测试在ie浏览器下测试.IE9,8,7也全部是乱码.查看编码就是UT ...
- Java 解决IE浏览器下载文件,文件名出现乱码问题
/** * 区分ie 和其他浏览器的下载文件乱码问题 * @param request * @param fileName * @return */ public String getFileName ...
- IE浏览器下载文件中文文件名乱码问题解决
处理过程 根据IE的F12中的log提示,是因为http头信息中的编码替换了html文件中的编码.我最初的思路是设置Tomcat默认编码,但是我发现我已经在Server.xml中设置过,想到这里我想到 ...
随机推荐
- (剑指Offer)面试题53:正则表达式匹配
题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...
- css换行缩进
1.换行缩进 <div id="alertiframe"> <span id="closeiframe">×</span> ...
- C#应用视频教程2.3 OPENGL虚拟仿真介绍
本节最重要的一个内容,就是让视野可以平移+旋转+缩放(就像打CS游戏一样以第一人称视角去观察物体,如果可能的话W,S,A,D四个按键控制人物移动,还有鼠标控制视角),本节最重要的一个概念就是设置观察视 ...
- 删除android ScrollView边界阴影方法
XML文件中添加以下方法: android:fadingEdge=”none” 或者,代码中设置为false即可 ScrollView.setHorizontalFadingEdgeEna ...
- 〖Android〗/system/etc/recovery-resource.dat
源代码中的解释:[platform_build/tools/releasetools/ota_from_target_files] # Recovery is generated as a patch ...
- 微信小程序弹窗组件
概述 自己封装的一个比较简单微信弹窗小组件,主要就是教会大家对微信小组件的用法和理解,因为微信小程序对组件介绍特别少,所以我就把自己的理解分享给大家 详细 代码下载:http://www.demoda ...
- 【转帖】Service Discovery: 6 questions to 4 experts
https://highops.com/insights/service-discovery-6-questions-to-4-experts/ What’s Service Discovery? I ...
- JavaScript常用語句
1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是: document->html->(head,body)4 ...
- Bootstrap 的模态框类
事件类型 描述 show.bs.modal show 方法调用之后立即触发该事件.如果是通过点击某个作为触发器的元素,则此元素可以通过事件的relatedTarget 属性进行访问. shown.bs ...
- MVC之Ajax.BeginForm使用详解之更新列表 mvc验证jquery.unobtrusive-ajax
MVC之Ajax.BeginForm使用详解之更新列表 1.首先,请在配置文件设置如下:(该项默认都存在且为true) <add key="UnobtrusiveJavaScrip ...