Как кодировать имя файла для загрузки?

Когда имя файла "Algunas MARCAS que nos acompañan", ASP.NET MVC поднимет System.FormatException при попытке загрузить этот файл. Но если имя файла "Asistente de Gerencia Comercial", это не так.

Я предполагаю, что это связано с тем, что что-то связано с кодировкой UTF-8, но я не знаю, как кодировать эту строку.

Если я прав, как я могу кодировать строку в кодировке UTF-8? Если я не прав, в чем моя проблема?

Ответы

Ответ 1

Я кодирую имя файла, подобное этому для загрузки,

HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));

Ответ 2

На основании ответа ZZ Coder и потому, что я использую FileResult, я решил кодировать имя файла как:

HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)

Ответ 3

Эта проблема известна годами. Насколько я могу судить, в настоящее время нет совместимого способа сделать это, поэтому ответ заключается только в поддержке одного набора браузеров или при использовании нюхательного агента пользователя.

Тестовые примеры и ссылки по адресу: http://greenbytes.de/tech/tc2231/

Ответ 4

Недавно я немного сражался, имея много потенциальных языков, используемых для имен файлов (с китайцами хорошо тестировать). Вот что близко к тому, что я закончил (исключены другие детали реализации):

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))

Ответ 6

обратите внимание, что использование кодировки UTF заменяет пробелы в имени файла на "+", используя либо следующие коды, вы получите те же результаты:

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)

Ответ 7

вместо httpUtility, который заменяет пробелы в имени файла на "+", используя следующий код, разрешает проблему:

string attachment = String.Format("attachment; filename={0}",Server.UrlPathEncode(file.Name.TrimEnd()));
Response.AddHeader("Content-Disposition", attachment);

обратите внимание, что если вы получите имя файла из набора данных, вам может понадобиться сначала обрезать имя! вы также должны заранее добавить следующие строки кода:

Response.Charset = "utf-8";
Response.HeaderEncoding = UnicodeEncoding.UTF8;
Response.ContentEncoding = UnicodeEncoding.UTF8;

Ответ 8

Единственный трюк, который работает (во всех браузерах) для меня:

Dim headerFileName As String = IIf(Request.Browser.Browser = "InternetExplorer" Or Request.UserAgent.Contains("Edge"), Uri.EscapeDataString(file.Name), file.Name)
Response.AddHeader("Content-Disposition", "attachment; filename=""" + headerFileName + """")