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

  在工作中有一个下载文件的功能,遇到一个低版本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编码方式来说,减少了响应标头中的文件名长度,但是如果文件名长度更长之后,仍可能出现文件名被截断的情况。

  

  

  

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

时间: 2024-11-11 20:07:16

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

Linux下使用vi新建文件保存文件时遇到错误:E212: Can&#39;t open file for writing

出现E212: Can't open file for writing的问题是由于权限问题导致的,解决方法有以下思路: 1.使用root进行登录,然后再操作. 2.在使用命令时,前面加sudo. 3.如果是多级文件夹的文件时,由于这个文件夹没有创建,所以要先创建这个文件夹,再来操作这个文件. Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing

EditPlus保存文件时不生成其备份文件的方法

3.将“保存时去掉备份文件”复选框去掉,点击 应用->确定,即可 . EditPlus保存文件时不生成其备份文件的方法

idea中,发现某个java语法在低版本中不支持时的解决办法

比如,在某个工程中,准备用java.util.Objects#equals语法,发现提示版本不支持. F4查看Module的配置,发现原来是1.6版本. 当我手动修改为1.8时,提示我:Module是在maven配置的java版本. 于是,去pom文件中,发现是spring boot的默认starter是java 1.6 . <parent> <groupId>org.springframework.boot</groupId> <artifactId>sp

Servlet:浏览器下载文件时文件名为乱码问题

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 String filename = request.getParameter("filename"); 3 System.out.println(filename); 4 String path = getServletContext().get

下载文件时文件名是中文,文件名丢失或者乱码的问题

解决方案 针对不同浏览器类型,对文件名字做编码处理 Firefox (Base64) :IE.Chrome ... 使用的是URLEncoder public class DownloadServlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取文

转载:C#保存文件时重名自动生成新文件的方法

/// <summary> /// Generates a new path for duplicate filenames. /// </summary> /// <param name="path">The path.</param> /// <returns></returns> private string GetNewPathForDupes( string path ) { string directo

MyEclipse保存文件时 自动格式化代码! 不包括文档注释

设置不格式化 文档注释

Eclipse 保存文件时自动格式化代码

很多同学不知道Eclipse有个很有用的功能,就是自动格式源代码的功能,一般大家都是直接Ctrl+Shift+F手动格式化,多浪费时间. 其实Eclipse里已经带有自动格式化功能了,默认是没有代开该功能的. 具体方法:windows-->Preferences-->Java --> Editor-->Save Actions, 看到右边的选项了吧,勾选"Perform the selected actions on save",其他选项根据需要自己选择或者配置

windows下修改文件时的换行符引起在linux运行不正常的解决

env: /etc/init.d/nginx: No such file or directory 原因:在windows下修改文件的时候换行符出的问题. windows和linux下的换行符是不同的.一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在linux上运行就生成LF格式换行的文本文件. 在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常,