Ответ 1
Я кодирую имя файла, подобное этому для загрузки,
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Когда имя файла "Algunas MARCAS que nos acompañan", ASP.NET MVC поднимет System.FormatException
при попытке загрузить этот файл. Но если имя файла "Asistente de Gerencia Comercial", это не так.
Я предполагаю, что это связано с тем, что что-то связано с кодировкой UTF-8
, но я не знаю, как кодировать эту строку.
Если я прав, как я могу кодировать строку в кодировке UTF-8
? Если я не прав, в чем моя проблема?
Я кодирую имя файла, подобное этому для загрузки,
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
На основании ответа ZZ Coder и потому, что я использую FileResult, я решил кодировать имя файла как:
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)
Эта проблема известна годами. Насколько я могу судить, в настоящее время нет совместимого способа сделать это, поэтому ответ заключается только в поддержке одного набора браузеров или при использовании нюхательного агента пользователя.
Тестовые примеры и ссылки по адресу: http://greenbytes.de/tech/tc2231/
Недавно я немного сражался, имея много потенциальных языков, используемых для имен файлов (с китайцами хорошо тестировать). Вот что близко к тому, что я закончил (исключены другие детали реализации):
HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
Также: HttpUtility считается вредным:
http://serialseb.blogspot.com/2008/03/httputilityurlencode-considered-harmful.html
Я просто собираюсь пнуть и заменить "на" _" и называть его днем =)
обратите внимание, что использование кодировки UTF заменяет пробелы в имени файла на "+", используя либо следующие коды, вы получите те же результаты:
HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)
вместо 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;
Единственный трюк, который работает (во всех браузерах) для меня:
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 + """")