Допустимые имена файлов (для скачивания) в IE? - PullRequest
2 голосов
/ 18 декабря 2011

У меня есть действие в aspnet mvc, которое возвращает FileContentResult.Я заметил, что когда fileDownloadName содержит умляуты (то есть текст), Internet Explorer вообще не может прочитать имя файла.

Я пробовал UrlEncoding:

return this.File(document.Content, contentType, Server.UrlEncode(document.Name));

, но тогда все пробелызаменены на знаки плюс (+).

Есть ли способ заставить работать имена файлов Unicode с IE (сохраняя исходное имя файла без изменений)?

Это то, чтоВ настоящее время я использую в качестве хака:

return this.File(
    document.Content, 
    contentType, 
    Server.UrlEncode(document.Name).Replace('+',' '));

(в IE это пространство подчеркивается как подчеркивание)

Ответы [ 4 ]

6 голосов
/ 18 декабря 2011
  1. UrlEncode неверно названо, оно только для данных формы. Вместо этого вы бы хотели UrlPathEncode, что решило бы проблему +. См. этот вопрос для фона.

  2. Однако в любом случае кодирование URL здесь не является правильным, поскольку вы не создаете URL. Тот факт, что он работает в IE, является ошибкой, поэтому вы получаете % -последовательности в других браузерах.

К сожалению, не существует надежного кросс-браузерного способа получения не-ASCII-символов в параметре Content-Disposition имени файла. Теоретически это могло бы быть возможно с использованием правил RFC 2331, но даже тогда спецификация спорна и реальность ничто не поддерживает. См. этот вопрос для фона.

Есть ли способ заставить имена файлов Unicode работать с IE (сохраняя исходное имя файла без изменений)?

Удалите параметр filename из заголовка Content-Disposition и вместо этого включите имя файла в качестве конечного пути в часть адреса вашего скрипта, где вполне допустимо использовать кодировку URL (UTF-8 и UrlPathEncode). например, для someaction контроллер:

http://www.example.com/someaction/åäöü.txt
http://www.example.com/someaction/%C3%A5%C3%A4%C3%B6%C3%BC.txt

Все браузеры предложат сохранить полученный файл как åäöü.txt.

1 голос
/ 18 декабря 2011

Для ответов использую решение из этой темы .Может быть, вы могли бы попробовать использовать его как

return this.File(
  document.Content,
  contentType,
  "\"" + Server.UrlEncode(document.Name) + "\"");

или

return this.File(
  document.Content,
  contentType,
  "\"" + document.Name + "\"");
0 голосов
/ 31 августа 2012

Я пробовал кодирование, хорошо работал в Chrome и FF, но у меня были проблемы с IE.Так что я просто придумал свою собственную процедуру очистки.По сути, это просто таблица сопоставления, поскольку мы не просто хотим удалить все специальные символы.

//http://www.pjb.com.au/comp/diacritics.html
private static string[,] CharacterReplacements = { 
    { " ", "-"},
    { "&", "-"},
    { "?", "-"},
    { "!", "-"},
    { "%", "-"},
    { "+", "-"},
    { "#", "-"},
    { ":", "-"},
    { ";", "-"},
    { ".", "-"},

    { "¢", "c" },   //cent
    { "£", "P" },   //Pound
    { "€", "E" },   //Euro
    { "¥", "Y" },   //Yen
    { "°", "d" },   //degree
    { "¼", "1-4" }, //fraction one-quarter
    { "½", "1-2" }, //fraction half    
    { "¾", "1-3" }, //fraction three-quarters}
    { "@", "AT)"}, //at                                                  
    { "Œ", "OE" },  //OE ligature, French (in ISO-8859-15)        
    { "œ", "oe" },  //OE ligature, French (in ISO-8859-15)        

    {"Å","A" },  //ring
    {"Æ","AE"},  //diphthong
    {"Ç","C" },  //cedilla
    {"È","E" },  //grave accent
    {"É","E" },  //acute accent
    {"Ê","E" },  //circumflex accent
    {"Ë","E" },  //umlaut mark
    {"Ì","I" },  //grave accent
    {"Í","I" },  //acute accent
    {"Î","I" },  //circumflex accent
    {"Ï","I" },  //umlaut mark
    {"Ð","Eth"}, //Icelandic
    {"Ñ","N" },  //tilde
    {"Ò","O" },  //grave accent
    {"Ó","O" },  //acute accent
    {"Ô","O" },  //circumflex accent
    {"Õ","O" },  //tilde
    {"Ö","O" },  //umlaut mark
    {"Ø","O" },  //slash
    {"Ù","U" },  //grave accent
    {"Ú","U" },  //acute accent
    {"Û","U" },  //circumflex accent
    {"Ü","U" },  //umlaut mark
    {"Ý","Y" },  //acute accent
    {"Þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter)
    {"ß","ss"},  //German

    {"à","a" },  //grave accent
    {"á","a" },  //acute accent
    {"â","a" },  //circumflex accent
    {"ã","a" },  //tilde
    {"ä","ae"},  //umlaut mark
    {"å","a" },  //ring
    {"æ","ae"},  //diphthong
    {"ç","c" },  //cedilla
    {"è","e" },  //grave accent
    {"é","e" },  //acute accent
    {"ê","e" },  //circumflex accent
    {"ë","e" },  //umlaut mark
    {"ì","i" },  //grave accent
    {"í","i" },  //acute accent
    {"î","i" },  //circumflex accent
    {"ï","i" },  //umlaut mark
    {"ð","eth"}, //Icelandic
    {"ñ","n" },  //tilde
    {"ò","o" },  //grave accent
    {"ó","o" },  //acute accent
    {"ô","o" },  //circumflex accent
    {"õ","o" },  //tilde
    {"ö","oe"},  //umlaut mark
    {"ø","o" },  //slash
    {"ù","u" },  //grave accent
    {"ú","u" },  //acute accent
    {"û","u" },  //circumflex accent
    {"ü","ue"},  //umlaut mark
    {"ý","y" },  //acute accent
    {"þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter)
    {"ÿ","y" },  //umlaut mark
    };

Я обернул его в функцию, код можно найти здесь:
http://remy.supertext.ch/2012/08/clean-filenames/

0 голосов
/ 18 декабря 2011

Просто закодируйте имя файла, как вы делаете, но затем замените все + на %20. Не проверено, но должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...