How do I encode a file name for download?

2019-03-09 20:57发布

When the file name is "Algunas MARCAS que nos acompañan" ASP.NET MVC raise an System.FormatException when I try to download that file. But if the file name is "Asistente de Gerencia Comercial" it doesn't.

I guess this is because something related to UTF-8 encoding, but I don't know how to encode that string.

If I'm right, how can I encode the string in UTF-8 encoding? If I'm not right, what is my problem?

7条回答
▲ chillily
2楼-- · 2019-03-09 21:02

note that using UTF encoding replaces the spaces in the file name into '+', using either the following codes produce the same results:

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)
查看更多
smile是对你的礼貌
3楼-- · 2019-03-09 21:07

I encode file name like this for downloading,

HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
查看更多
beautiful°
4楼-- · 2019-03-09 21:11

Based on ZZ Coder answer, and because I'm using FileResult, I decided to encode the file name as:

HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)
查看更多
该账号已被封号
5楼-- · 2019-03-09 21:17

I recently fought with this a bit, having many potential languages being used for the file names (Chinese is good to test with). Here is something close to what I ended up with (other implementation details excluded):

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
查看更多
霸刀☆藐视天下
6楼-- · 2019-03-09 21:22

This issue has been known for years. As far as I can tell, there currently is no interoperable way to do this, so the answer is to only support one set of browsers, or to do User Agent sniffing.

Test cases and links at: http://greenbytes.de/tech/tc2231/

查看更多
小情绪 Triste *
7楼-- · 2019-03-09 21:29

Also: HttpUtility considered harmful:
http://serialseb.blogspot.com/2008/03/httputilityurlencode-considered-harmful.html

I'm just going to punt and replace " " with "_" and call it a day =)

查看更多
登录 后发表回答