场景:
开发中常常遇到文件下,有时需要下载后的文件名自己定义,而不是服务器上的文件名,这是需要用到HTTP中的Content-dispostion
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。
文件下载例子:
//判断是否是IE
$is_IE = strstr($_SERVER['HTTP_USER_AGENT'],'MSIE');
if($is_IE){
//设置HTTP头信息,IE中Content-Disposition:inline 和attachment 都可以下载
header("Content-type: text/javascript");
header("Content-Disposition: attachment; filename=\"download.js\"");
header("Content-Length: ".filesize("01.js"));
}else{
//但是Content-Disposition:inline在FF和chrome 中无法载,所以使用attachment
header("Content-type: text/javascript");
header("Content-Disposition: attachment; filename=\"download.js\"");
header("Content-Length: ".filesize("01.js"));
}
if(!$is_IE){
//控制缓存
header("Cache-Control: no-cache");
header("Pragma: no-cache");
}
//引入输出文件
include("01.js");
在该例中FF和chrome中需要将Content-disposition设置为attachment才可以下载成功。否则会直接在浏览器上显示文本内容
解决乱码问题:
1.首先将页面的编码设置成UTF-8编码
2.在IE中显示的中文名称用urlencode()函数编码,其他浏览器直接输出文件名
例子:
$name = '测试001.js';
$name = urlencode($name);
//判断是否是IE
$is_IE = strstr($_SERVER['HTTP_USER_AGENT'],'MSIE');
if($is_IE){
//设置HTTP头信息,IE中Content-Disposition:inline 和attachment 都可以下载
header("Content-type: text/javascript");
header("Content-Disposition: attachment; filename=\"".$name."\"");
header("Content-Length: ".filesize("01.js"));
}else{
//但是Content-Disposition:inline在FF和chrome 中无法载,所以使用attachment
header("Content-type: text/javascript");
header("Content-Disposition: attachment; filename=\"".'测试001.js'."\"");
header("Content-Length: ".filesize("01.js"));
}
if(!$is_IE){
//控制缓存
header("Cache-Control: no-cache");
header("Pragma: no-cache");
}
//引入输出文件
include("01.js");