码迷,mamicode.com
首页 > 其他好文 > 详细

低版本ie保存文件时,文件名过长被截断

时间:2018-07-26 15:11:07      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:img   system   保存文件   clear   adf   截断   turn   功能   方式   

  在工作中有一个下载文件的功能,遇到一个低版本ie保存文件时,文件名过长被截断的问题。

  asp.net MVC下载文件代码:  

1 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadFilePath);
2 request.KeepAlive = false;
3 WebResponse response = request.GetResponse();
4 Stream stream = response.GetResponseStream();
5 return File(stream, "application/octet-stream" , HttpUtility.UrlEncode(downloadFileName, System.Text.Encoding.UTF8).Replace("+", "%20"));

  开始时,将文件名用utf-8编码,通过查看响应标头,可以看到完整的utf-8编码后的文件名。但是在保存时,如果文件名过长,文件名会从前面被截断

  技术分享图片

  

  修改后的下载文件代码:  

 1 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadFilePath);
 2 request.KeepAlive = false;
 3 WebResponse response = request.GetResponse();
 4 List<byte> bytes = new List<byte>();
 5 using (Stream stream = response.GetResponseStream())
 6 {
 7     int temp = stream.ReadByte();
 8     while (temp != -1)
 9     {
10         bytes.Add((byte)temp);
11         temp = stream.ReadByte();
12     }
13 }
14 Response.Clear();
15 //设置响应头编码为gb2312,如果直接返回UTF-8编码的文件名,低版本ie保存文件时,如果文件名过长,会将文件名前面部分截断
16 //设置响应头编码为gb2312后文件名如果长太多,低版本ie保存文件时,仍会截断
17 Response.HeaderEncoding = System.Text.Encoding.GetEncoding("gb2312");
18 Response.AddHeader("Content-Disposition", "attachment; filename=\"" + downloadFileName + "\"");
19 Response.ContentEncoding = System.Text.Encoding.UTF8;
20 Response.ContentType = "application/octet-stream";
21 Response.BinaryWrite(bytes.ToArray());
22 Response.Flush();
23 Response.End();
24 return new EmptyResult();

  修改后将响应标头的编码设置为gb2312,文件名不进行编码

  技术分享图片

  对比可以看到到,这次响应标头中的文件名长度变短了,所以保存时文件名未被截断。这种方式只是相对于utf-8编码方式来说,减少了响应标头中的文件名长度,但是如果文件名长度更长之后,仍可能出现文件名被截断的情况。

  

  

 

  

低版本ie保存文件时,文件名过长被截断

标签:img   system   保存文件   clear   adf   截断   turn   功能   方式   

原文地址:https://www.cnblogs.com/muliang/p/9371285.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!