Скачивание файла с ";" или "#" в имени файла рушит имя файла - PullRequest
2 голосов
/ 30 марта 2009

У меня есть файл с именем AttachmentDownload.aspx, и внутри метода Page_Load есть такой код, который предлагает скачать файл. Все имена работают правильно в IE, кроме имен, которые включают ";" или же "#". Они предлагают пользователю сохранить файл под именем «AttachmentDownload.aspx». Есть ли обходной путь для этого?

Вот пример:

var fileName = Server.UrlPathEncode (";%.txt");
Response.AddHeader("content-disposition", String.Format("attachment;filename=\"{0}\"", fileName));
Response.WriteFile(path);
Response.End();

Ответы [ 4 ]

8 голосов
/ 30 марта 2009

Все имена работают правильно в IE, кроме имен, которые включают ";" или "#".

Я не могу воспроизвести проблему с "#", но ";" определенно ее устраняет. Как и will "’ и ‘\’ (которые вы можете использовать в имени файла в Unix и которые сломают вашу строку в кавычках).

«Правильное» решение для включения внеполосных символов в параметризованный заголовок семейства RFC822, такой как Content-Disposition, определено в RFC1521 : строки, которые не могут содержаться в «токене», должны быть заключенным в строку в кавычках, которую RFC2822 определяет как наличие экранированного "и \ символов обратной косой черты, затем заключенное в кавычки.

RFC2231 затем расширяет это очень сложным способом включения не-ASCII символов в параметры заголовка, которые в теории вы хотели бы использовать для поддержки символов Unicode.

На практике: HTTP на самом деле не является спецификацией семейства RFC822, и ни одна из этих вещей не работает в обычных браузерах (кроме обратной косой черты в Opera). Не существует надежного способа получить имя файла Unicode Content-Disposition для клиента, и ваша проблема с ';' заключается не в какой-либо проблеме с выходом, а в том, что IE не может проанализировать параметризованные заголовки для ириски (он разбивается на следующая точка с запятой в строке, даже если она заключена в кавычки).

Для надежной кросс-браузерной настройки имени файла в реальном мире можно использовать два подхода:

  1. Удалите все оскорбительные из имен файлов, прежде чем помещать их в заголовок Content-Disposition. Это включает в себя начальные / конечные пробелы / точки, большинство других знаков препинания и все, что не ASCII.

  2. Ни в коем случае не указывайте имя файла в заголовке Content-Disposition, и пусть браузер определит, какое имя файла использовать из последней части URL. Чтобы остановить его, выбрав «AttachmentDownload.aspx», вы можете поместить все, что вам нравится, в качестве конечной части URL, например:

    http://www.example.com/AttachmentDownload.aspx/Foo%23Bar

Для этого требуется, чтобы большинство знаков пунктуации кодировалось с использованием простой URL-кодировки и символов Юникода с UTF-8, но, по крайней мере, вы можете вводить символы. Выше приведено приглашение к загрузке файла для «Foo; Bar».

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

3 голосов
/ 31 августа 2012

Я начал просто чистить свои имена файлов от всех специальных символов. Я придумал таблицу отображения, которая должна отображать большинство часто используемых символов.

//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/

Дайте мне знать, если найдете недостающие символы.

2 голосов
/ 21 апреля 2010

Имя файла со специальными символами (например, пробел; # @! $) Или не-Unicode-символы либо не поддерживаются некоторыми браузерами, либо приводят к неверному имени файла на клиентском компьютере. Вот статья китайца под названием chanext, он дал идеальный способ решения этой проблемы: В этой статье приведен пример кода (написанный на c #), чтобы показать, как получить идеальное решение этой проблемы во всех четырех популярных браузерах (IE; Opera; Firefox и Chrome). имя файла «Microsoft.Asp.Net.doc» и «F ile ;;! @% # ^ & y.doc» могут быть правильно выведены с использованием способа, предоставленного автором в этой статье.

http://ciznx.com/post/aspnetstreamdownloaddisplaynonunicodespacechar.aspx

0 голосов
/ 30 марта 2009

UrlPathEncode кодирует только часть "Path" сформированной строки, похожей на URL, попробуйте использовать Server.UrlEncode или HttpUtility.UrlEncode .

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