ASP .NET Загружает файл с японским именем файла
-
07-07-2019 - |
Вопрос
В настоящее время я использую Visual Studio 2008 для своего приложения ASP .NET.Я пытаюсь отправить на сервер файл Excel через объект Response .Проблема в том, что, похоже, я не могу установить заголовок файла на японский.Если я установлю для него японское имя файла, оно будет возвращено как символ мусора.Я использую японский браузер IE в японском WinXP.
Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", "日本語.xls"));
или
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", Server.HtmlEncode("日本語.xls")));
Я уже пытался изменить кодировку на Shift-JIS
Response.Charset = "Shift_JIS";
или
Response.Charset = "sjis";
Есть какие-нибудь идеи?Кстати, у меня тоже была такая же проблема с Visual Studio 2005.
Решение
Я не эксперт по ASP, но вы пробовали перекодировать имя файла с помощью UrlEncode?
Response.AddHeader("Content-Disposition",
System.Web.HttpUtility.UrlEncode(String.Format("attachment; filename=\"{0}\"", "日本語.xls")));
Другие советы
Response.Charset
касается только тела HTTP-запроса.Согласно спецификация HTTP, заголовки неявно кодируются как ISO-8859-1 - символы вне этой кодировки должны быть MIME-кодированный.
Это вполне логично - в конце концов, кодировка тела, установленная Response.Charset
сам по себе указан в заголовке.
Наконец-то у меня это заработало...:)
Использование System.Web.HttpUtility.UrlPathEncode
решает проблему мусора, но когда вы открываете файл, в имени файла вместо реальных японских символов отображаются имена, не закодированные в юникоде.(Ну, это проблема в IE7 и IE6, UrlPathEncode отлично работает с IE8.)
Итак, вместо того, чтобы использовать System.Web.HttpUtility.UrlPathEncode
вы должны расшифровать имя файла, используя кодировку, используемую для заголовка ответа.
В .NET по умолчанию кодировкой заголовка ответа является utf-8, измените ее на iso-8859-1.Измените web.config для того же, как показано ниже,
<globalization responseHeaderEncoding="iso-8859-1" .../>
И код был бы,
//apply Response header's encoding i.e. iso-8859-1 to the filename.
Dim fileName as String = "在庫あり全商品を24時間以内に出荷.doc"
Dim enc As Encoding = Encoding.GetEncoding("shift_jis")
Dim dec As Encoding = Encoding.GetEncoding("iso-8859-1")
fileName = dec.GetString(enc.GetBytes(fileName))
//Show Download Dialog box and Writting it on Client Side.
Response.ClearHeaders()
Response.ContentType = corspBean.ContentType
Response.AppendHeader("content-disposition", "attachment; filename=""" + fileName + """")
Response.BinaryWrite(bytes)
Response.End()
Теперь, еще одна важная вещь, из-за которой я потратил впустую много времени, это это не работает на ASP.NET Сервере разработки то есть сервер, который вы используете для тестирования / отладки веб-приложений на вашем локальном компьютере.Итак, разверните решение в IIS и протестируйте оттуда.Это прекрасно работает в IIS.(и IIS - это судьба каждого ASP.NET приложения;) поэтому не имеет значения, работает ли оно на ASP.NET Сервере разработки или нет)