浏览器文件下载及文件名编码问题

Content-disposition 是 MIME 协议的扩展, MIME 协议指示 MIME 用户代理 如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)
Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。具体的定义如下

content-disposition = “Content-Disposition” “:”
disposition-type *( “;” disposition-parm )
disposition-type = “attachment” | disp-extension-token
disposition-parm = filename-parm | disp-extension-parm
filename-parm = “filename” “=” quoted-string
disp-extension-token = token
disp-extension-parm = token “=” ( token | quoted-string )

那么由上可知具体的例子: Content-Disposition: attachment; filename=“filename.xls”

当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。当你在响应类型为 application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个” 文件下载”的对话框,接下来就是由你来决定“打开”还是“保存” 了。

如:Response.AppendHeader("Content-Disposition","attachment;filename=MyExcel.xls");

python使用的一个例子:

print "Content-type: application/x-pcap";

print "Content-Disposition: attachment; filename=\"filename.pcap\"\n";

w3c的说明:http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html


浏览器中文件名乱码问题:

浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的Content-Disposition,那么应该就不会出现中文文件名的乱码问题了。
首先,Content-Disposition值可以有以下几种编码格式
1. 直接urlencode:

    Content-Disposition: attachment; filename="struts2.0%E4%B8%AD%E6%96%87%E6%95%99%E7%A8%8B.chm"

2. Base64编码:

    Content-Disposition: attachment; filename="=?UTF8?B?c3RydXRzMi4w5Lit5paH5pWZ56iLLmNobQ==?="

3. RFC2231规定的标准:

    Content-Disposition: attachment; filename*=UTF-8''%E5%9B%9E%E6%89%A7.msg

4. 直接ISO编码的文件名:

    Content-Disposition: attachment;filename="测试.txt"

然后,各浏览器支持的对应编码格式为:

1.  IE浏览器,采用URLEncoder编码
2.  Opera浏览器,采用filename*方式
3.  Safari浏览器,采用ISO编码的中文输出
4.  Chrome浏览器,采用Base64编码或ISO编码的中文输出
5.  FireFox浏览器,采用Base64或filename*或ISO编码的中文输出


new_filename = URLEncoder.encode(filename, "UTF8"); 
// 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的 
rtn = "filename=\"" + new_filename + "\""; 
if (userAgent != null) 

     userAgent = userAgent.toLowerCase(); 
      // IE浏览器,只能采用URLEncoder编码 
     if (userAgent.indexOf("msie") != -1) 
    { 
        rtn = "filename=\"" + new_filename + "\""; 
    } 
     // Opera浏览器只能采用filename* 
     else if (userAgent.indexOf("opera") != -1) 
     { 
        rtn = "filename*=UTF-8''" + new_filename; 
    } 
    // Safari浏览器,只能采用ISO编码的中文输出 
      else if (userAgent.indexOf("safari") != -1 ) 
      { 
          rtn = "filename=\"" + new String(filename.getBytes("UTF-8"),"ISO8859-1") + "\""; 
      } 
      // Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出 
      else if (userAgent.indexOf("applewebkit") != -1 ) 
       { 
         new_filename = MimeUtility.encodeText(filename, "UTF8", "B"); 
          rtn = "filename=\"" + new_filename + "\""; 
       } 
      // FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出 
       else if (userAgent.indexOf("mozilla") != -1) 
       { 
          rtn = "filename*=UTF-8''" + new_filename; 
      } 
   } 

代码:

	response = HttpResponse(data,<span style="color:#FF0000;">mimetype='application/octet-stream</span>') 
	response['Content-Disposition'] ='<span style="color:#FF0000;">attachment; filename*=UTF-8\'\'%s'    %urlquote(filename.encode('utf8')</span>)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值