Как закодировать параметр имени файла заголовка Content-Disposition в HTTP?


535

Веб-приложения, которые хотят принудительно загружать ресурс, а не напрямую отображать его в веб-браузере, выдают Content-Dispositionзаголовок в HTTP-ответе формы:

Content-Disposition: attachment; filename=FILENAME

filenameПараметр может быть использован , чтобы предложить имя файла , в котором ресурс загружается браузером. RFC 2183 (Content-Disposition), однако, утверждает в разделе 2.3 (Параметр имени файла), что имя файла может использовать только символы US-ASCII:

Текущая грамматика [RFC 2045] ограничивает значения параметров (и, следовательно, имена файлов Content-Disposition) US-ASCII. Мы признаем большую желательность разрешения произвольных наборов символов в именах файлов, но это выходит за рамки этого документа, чтобы определить необходимые механизмы.

Тем не менее, существует эмпирическое доказательство того, что большинство популярных веб-браузеров сегодня, по-видимому, допускают символы не-US-ASCII, но (из-за отсутствия стандарта) не согласны со схемой кодирования и спецификацией набора символов имени файла. Тогда возникает вопрос, каковы различные схемы и кодировки, используемые популярными браузерами, если имя файла «naïvefile» (без кавычек и где третья буква U + 00EF) необходимо кодировать в заголовок Content-Disposition?

Для этого вопроса популярными браузерами являются:

  • Fire Fox
  • Internet Explorer
  • Сафари
  • Гугл Хром
  • опера

Это работает для Mobile Safari (raw utf-8, как предложено @Martin Ørding-Thomsen), но это не работает для GoodReader с того же устройства. Любые идеи?
— Тило


1
Ответ Корнеля оказался путем наименьшего сопротивления, если вы можете установить последний отрезок пути; соедините это с Content-Disposition: attachment.
— Антти Хаапала

Ответы:


94

Это обсуждается, включая ссылки на тестирование браузера и обратную совместимость, в предлагаемом RFC 5987 , «Набор символов и кодировка языка для параметров поля заголовка протокола передачи гипертекста (HTTP)».

RFC 2183 указывает, что такие заголовки должны быть закодированы в соответствии с RFC 2184 , который был устаревшим из RFC 2231 , описанного в проекте RFC выше.


5
Также обратите внимание, что интернет-черновик (не «черновик RFC») был закончен, и окончательным документом является RFC 5987 ( greenbytes.de/tech/webdav/rfc5987.html )
— Джулиан Решке

11
В связи с этим я обнаружил, что Firefox (версии 4-9 включительно) ломаются, если в имени файла есть запятая (,), например Content-Disposition: filename="foo, bar.pdf". В результате Firefox загружает файл правильно, но сохраняет .partрасширение (например foo,bar.pdf-1.part). Тогда, конечно, файл не будет открываться правильно, потому что приложение не связано с .part. Другие символы ASCII работают нормально.
— catchdave

3
Для получения дополнительной информации о поведении IE см. Blogs.msdn.com/b/ieinternals/archive/2010/06/07/…
— EricLaw

5
@catchdave: Вы забыли «вложение»; часть.
— Кристофер Хаммарстрем

6
В общем, это не что иное, как ответ только на ссылку с 74 голосами против.
— Антти Хаапала

364

Я знаю, что это старый пост, но он все еще очень актуален. Я обнаружил, что современные браузеры поддерживают rfc5987, который допускает кодирование utf-8 в процентах (в кодировке url). Тогда Наивный файл .txt становится:

Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt

Safari (5) не поддерживает это. Вместо этого вам следует использовать стандарт Safari для записи имени файла непосредственно в ваш кодированный заголовок utf-8:

Content-Disposition: attachment; filename=Naïve file.txt

IE8 и старше также не поддерживают его, и вам нужно использовать стандарт IE в кодировке utf-8, в процентах:

Content-Disposition: attachment; filename=Na%C3%AFve%20file.txt

В ASP.Net я использую следующий код:

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.Browser.Browser == "Safari")
    contentDisposition = "attachment; filename=" + fileName;
else
    contentDisposition = "attachment; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

Я протестировал вышеизложенное с помощью IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5.

Обновление ноябрь 2013:

Вот код, который я сейчас использую. Мне все еще нужно поддерживать IE8, поэтому я не могу избавиться от первой части. Оказывается, что браузеры на Android используют встроенный менеджер загрузок Android, и он не может надежно анализировать имена файлов стандартным способом.

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.UserAgent != null && Request.UserAgent.ToLowerInvariant().Contains("android")) // android built-in download manager (all browsers on android)
    contentDisposition = "attachment; filename=\"" + MakeAndroidSafeFileName(fileName) + "\"";
else
    contentDisposition = "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

Вышеизложенное теперь протестировано в IE7-11, Chrome 32, Opera 12, FF25, Safari 6, используя для загрузки следующее имя файла: ^ ~ -_,;. TXT

На IE7 это работает для некоторых символов, но не для всех. Но кого волнует IE7 в наше время?

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

private static readonly Dictionary<char, char> AndroidAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@£$€!½§~'=()[]{}0123456789".ToDictionary(c => c);
private string MakeAndroidSafeFileName(string fileName)
{
    char[] newFileName = fileName.ToCharArray();
    for (int i = 0; i < newFileName.Length; i++)
    {
        if (!AndroidAllowedChars.ContainsKey(newFileName[i]))
            newFileName[i] = '_';
    }
    return new string(newFileName);
}

@TomZ: я тестировал в IE7 и IE8, и оказалось, что мне не нужно избегать апострофа ('). У вас есть пример, где это не удается?

@Dave Van den Eynde: Объединение двух имен файлов в одной строке, как в соответствии с RFC6266, работает за исключением Android и IE7 + 8, и я обновил код, чтобы отразить это. Спасибо за предложение.

@Thilo: понятия не имею о GoodReader или любом другом браузере. Возможно, вам повезет, используя подход Android.

@ Алекс Жуковский: Я не знаю почему, но, как уже говорилось в Connect, это не очень хорошо работает.


1
Это работает для Mobile Safari (raw utf-8, как предложено выше), но это не работает для GoodReader с того же устройства. Любые идеи?
— Тило

1
IE7 и 8 также нужно избегать апострофов: .Replace ("'", Uri.HexEscape (' \ ''))
— TomZ

1
Непосредственное написание символов UTF-8, кажется, работает для текущих версий Firefox, Chrome и Opera. Не тестировал Safari & IE.
— Мартин Турной

21
Почему бы не объединить их, так как Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt; filename=Na%C3%AFve%20file.txtи браузер пропускает сниффинг? Будет ли это работать?
— Дэйв Ван ден Эйнде

9
Добрые люди в fastmail нашли другой обходной путь: blog.fastmail.com/2011/06/24/download-non-english-filenames Content-Disposition: attachment; имя файла = "foo-% c3% a4.html"; filename * = UTF-8''foo-% c3% a4.html Если дважды указать fileName (один раз без префикса UTF-8 и один раз с), он будет работать в IE8-11, Edge, Chrome, Firefox и Safari ( кажется, что в Apple исправлено сафари, так что теперь оно работает и там)
— wullinkm

169

Существует простая и очень надежная альтернатива: используйте URL, который содержит желаемое имя файла .

Когда имя после последней косой черты соответствует желаемому, вам не нужны дополнительные заголовки!

Этот трюк работает:

/real_script.php/fake_filename.doc

И если ваш сервер поддерживает перезапись URL (например, mod_rewriteв Apache), то вы можете полностью скрыть часть скрипта.

Символы в URL должны быть в кодировке UTF-8 побитно:

/mot%C3%B6rhead   # motörhead

3
Попробуйте GetAttachment.aspx / fake_filename.doc? Id = 34 (хотя это может быть причудой только для Apache)
— Kornel

2
это фантастическое решение; мне очень помогло. Спасибо.
— Кристополус

6
Я пошел по кроличьей тропе и попробовал некоторые другие решения; пытаться найти правильный браузер и версию для правильной установки заголовков - слишком большой кошмар. Chrome неправильно идентифицировал себя как Safari, который не ведет себя одинаково (разрывается на запятые, если не закодирован правильно). Избавьте себя от неприятностей, используйте это решение и добавьте псевдоним URL по мере необходимости.
— mpen

3
/:id/:filenameМетод очень прост и работает, спасибо!
— Лука Стиб

2
Тысячу раз "Да". Вы серьезно выиграете время с этим. Больше даже - некоторые Android браузеры утончаются игнорироватьContent-Disposition и создавать очень интересные имена файлов вместо (они будут сгенерированы с вашего пути). Таким образом, единственное решение для сохранения здравомыслия - это просто установить Content-Disposition: attachmentи передать желаемое имя файла в качестве последнего компонента пути:
— Julik

73

RFC 6266 описывает « Использование поля заголовка расположения содержимого в протоколе передачи гипертекста (HTTP) ». Цитата из этого:

6. Вопросы интернационализации

Параметр « filename*» ( раздел 4.3 ), использующий кодировку, определенную в [ RFC5987 ], позволяет серверу передавать символы вне набора символов ISO-8859-1, а также дополнительно указывать используемый язык.

И в разделе их примеров :

Этот пример такой же, как приведенный выше, но с добавлением параметра «имя файла» для совместимости с пользовательскими агентами, не поддерживающими RFC 5987 :

Content-Disposition: attachment;
                     filename="EURO rates";
                     filename*=utf-8''%e2%82%ac%20rates

Примечание. Те пользовательские агенты, которые не поддерживают кодировку RFC 5987, игнорируют « filename*», когда это происходит после « filename».

В Приложении D также приведен длинный список предложений по повышению совместимости. Он также указывает на сайт, который сравнивает реализации . Текущие универсальные тесты, подходящие для общих имен файлов, включают:

  • attwithisofnplain : простое имя файла ISO-8859-1 с двойными кавычками и без кодировки. Для этого требуется имя файла, которое соответствует ISO-8859-1 и не содержит знаков процента, по крайней мере, перед шестнадцатеричными цифрами.
  • attfnboth : два параметра в порядке, описанном выше. Должно работать для большинства имен файлов в большинстве браузеров, хотя IE8 будет использовать параметр « filename».

Этот RFC 5987, в свою очередь, ссылается на RFC 2231 , который описывает фактический формат. 2231 в основном для почты, а 5987 сообщает нам, какие части можно использовать и для заголовков HTTP. Не путайте это с заголовками MIME, используемыми внутри телаmultipart/form-data HTTP , которое регулируется RFC 2388 ( в частности, раздел 4.4 ) и проектом HTML 5 .


1
У меня были проблемы в сафари. При загрузке файлов с русскими именами получаются ошибочные и нечитаемые символы. Решение помогло. Но нам нужно отправить заголовок в одну строку (!!!).
— Евтуховдо

16

Следующий документ, связанный с проектом RFC, упомянутым Джимом в его ответе, дополнительно рассматривает этот вопрос и, безусловно, заслуживает прямой заметки:

Тестовые случаи для заголовка HTTP Content-Disposition и кодировки RFC 2231/2047


Обратите внимание, что можно предоставить оба способа кодирования параметра имени файла, и что они, по-видимому, корректно работают со старыми браузерами и новыми браузерами (старыми являются MSIE8 и Safari в данном случае). Проверьте attfnboth в отчете, упомянутом @AtifAziz.
— Пабло Монтилья

11

в asp.net mvc2 я использую что-то вроде этого:

return File(
    tempFile
    , "application/octet-stream"
    , HttpUtility.UrlPathEncode(fileName)
    );

Я думаю, что если вы не используете mvc (2), вы можете просто закодировать имя файла, используя

HttpUtility.UrlPathEncode(fileName)

2
Кодировка URL для кодировки имени файла недопустима, браузеры не должны их декодировать.
— SerialSeb

IE 11 определенно не декодирует кодировку URL в этом поле.
— псевдокодер

Но он должен быть UrlEncoded, когда браузер - это Chrome или IE, другие, такие как FF, Safari и Opera, прекрасно работают без кодирования
— Reza

11

Поместите имя файла в двойные кавычки. Решил проблему для меня. Нравится:

Content-Disposition: attachment; filename="My Report.doc"

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

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


3
К сожалению, это не решает все проблемы, описанные в ответах выше.
— Лука Стиб

2
Это позволит вам вернуть имя файла с пробелами, &, %, и #т.д. Таким образом , он решает , что.
— Дон Чидл

Что, если имя файла содержит двойные кавычки (да, это может произойти). Как указано в RFC 6266, имя файла является «строкой в ​​кавычках», и, как указано в RFC 2616, двойные кавычки в строке в кавычках должны быть экранированы обратной косой чертой.
— Кристоф Русси,

10

Я использую следующие фрагменты кода для кодирования (при условии, что fileName содержит имя файла и расширение файла, то есть: test.txt):


PHP:

if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
     header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $fileName ) . '"' );
}
else
{
     header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $fileName ) );
}

Ява:

fileName = request.getHeader ( "user-agent" ).contains ( "MSIE" ) ? URLEncoder.encode ( fileName, "utf-8") : MimeUtility.encodeWord ( fileName );
response.setHeader ( "Content-disposition", "attachment; filename=\"" + fileName + "\"");

Правильно, он должен быть rawurlencodeв PHP по крайней мере для filename*=заголовка расположения, поскольку value-charsиспользуется в ext-valueRFC 6266-> RFC 5987 (см. Tools.ietf.org/html/rfc6266#section-4.1 & tools.ietf.org/html/rfc5987#section -3.2.1 ) не разрешает пространство без экранирования процентов ( filename=с другой стороны, кажется, что это может разрешить пространство без экранирования вообще, хотя здесь должен присутствовать только ASCII). Нет необходимости кодировать с полной строгостью rawurlencode, поэтому можно убрать
— Бретт Замир,

9

В ASP.NET Web API я кодирую имя файла:

public static class HttpRequestMessageExtensions
{
    public static HttpResponseMessage CreateFileResponse(this HttpRequestMessage request, byte[] data, string filename, string mediaType)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new MemoryStream(data);
        stream.Position = 0;

        response.Content = new StreamContent(stream);

        response.Content.Headers.ContentType = 
            new MediaTypeHeaderValue(mediaType);

        // URL-Encode filename
        // Fixes behavior in IE, that filenames with non US-ASCII characters
        // stay correct (not "_utf-8_.......=_=").
        var encodedFilename = HttpUtility.UrlEncode(filename, Encoding.UTF8);

        response.Content.Headers.ContentDisposition =
            new ContentDispositionHeaderValue("attachment") { FileName = encodedFilename };
        return response;
    }
}

IE 9 не исправлено
IE 9 Исправлено


5

Я протестировал следующий код во всех основных браузерах, включая более старые Explorers (через режим совместимости), и он хорошо работает везде:

$filename = $_GET['file']; //this string from $_GET is already decoded
if (strstr($_SERVER['HTTP_USER_AGENT'],"MSIE"))
  $filename = rawurlencode($filename);
header('Content-Disposition: attachment; filename="'.$filename.'"');

5

Я закончил со следующим кодом в моем скрипте "download.php" (на основе этого поста и этих тестовых случаев ).

$il1_filename = utf8_decode($filename);
$to_underscore = "\"\\#*;:|<>/?";
$safe_filename = strtr($il1_filename, $to_underscore, str_repeat("_", strlen($to_underscore)));

header("Content-Disposition: attachment; filename=\"$safe_filename\""
.( $safe_filename === $filename ? "" : "; filename*=UTF-8''".rawurlencode($filename) ));

При этом используется стандартный способ имени файла = "...", если используются только символы iso-latin1 и "safe"; если нет, то добавляется имя файла * = UTF-8 '' в кодировке URL. В соответствии с этим конкретным тестовым примером , он должен работать с MSIE9 и выше, и на последних FF, Chrome, Safari; в более низкой версии MSIE он должен предлагать имя файла, содержащее версию имени файла ISO8859-1, с подчеркиванием на символах, не входящих в эту кодировку.

Конечная нота: макс. Размер каждого поля заголовка на Apache составляет 8190 байт. UTF-8 может содержать до четырех байтов на символ; после rawurlencode это x3 = 12 байт на один символ. Довольно неэффективно, но теоретически все еще должно быть возможно иметь более 600 «улыбок»% F0% 9F% 98% 81 в имени файла.


... но максимальная длина передаваемого имени файла также зависит от клиента. Только что обнаружил, что самое большее [89 смайлов😁] .pdf имя файла проходит через MSIE11. В Firefox37 это самое большее [111x 😁] .pdf. Chrome41 усекает имя файла на 110-й улыбке. Интересно, что суффикс переносится нормально.
— apurkrt

5

Если вы используете серверную часть nodejs, вы можете использовать следующий код, который я нашел здесь

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" 
             + encodeRFC5987ValueChars(fileName);

function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            // so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

1
Лучше использовать encodeURI(str). Как пример с датами в имени файла: encodeURIComponent('"Kornél Kovács 1/1/2016')=> "Kornél Kovács 1% 2F1% 2F2016" против encodeURI('"Kornél Kovács 1/1/2016')=> "Kornél Kovács 1/1/2016"
— gdibble

4

В PHP это сделало это для меня (при условии, что имя файла в кодировке UTF8):

header('Content-Disposition: attachment;'
    . 'filename="' . addslashes(utf8_decode($filename)) . '";'
    . 'filename*=utf-8\'\'' . rawurlencode($filename));

Протестировано на IE8-11, Firefox и Chrome.
Если браузер может интерпретировать имя файла * = utf-8, он будет использовать версию имени файла в формате UTF8, иначе он будет использовать декодированное имя файла. Если ваше имя файла содержит символы, которые не могут быть представлены в ISO-8859-1, вы можете использовать их iconvвместо этого.


3
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как он отвечает на вопрос, значительно улучшит его долгосрочную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения.
— Тоби Спейт

2
Ооо, ни один из приведенных выше кодовых ответов не получил такого отрицательного ответа или такой критики. Кроме того, я нашел , почему ответил достаточно хорошо уже: IE не интерпретирует имя файла * = UTF-8 , но нуждается в ISO8859-1 версии файла, который этот скрипт делает предложение. Только хотел дать ленивому рабочий простой код для PHP.
— Густав

Я думаю, что это было опровергнуто, потому что вопрос не зависит от языка, а о том, к чему следует привязываться при реализации кодирования заголовка. Однако спасибо за этот ответ, для PHP, этот код заставил мои проблемы уйти.
— j4k3

Спасибо. Этот ответ, возможно, не полностью ответил на вопрос, но это было именно то, что я искал, и помог мне решить проблему в Python.
— Линдси Симон

1
Я уверен, что этот код можно использовать как вектор атаки, если пользователь может контролировать имя файла.
— Антти Хаапала

3

Просто обновление, так как я пробовал все это сегодня в ответ на проблему клиента

  • За исключением Safari, настроенного для японского языка, все протестированные нашим клиентом браузеры лучше всего работали с filename = text.pdf - где text - это значение клиента, сериализованное ASP.Net/IIS в utf-8 без кодировки url. По какой-то причине Safari, настроенный для английского языка, будет принимать и правильно сохранять файл с японским именем utf-8, но тот же браузер, настроенный для японского, будет сохранять файл с символами utf-8 без интерпретации. Все остальные протестированные браузеры, кажется, работали лучше / лучше (независимо от языковой конфигурации) с именем файла utf-8, закодированным без URL-кодировки.
  • Я не смог найти ни одного браузера , реализующий Rfc5987 / 8187 на всех . Я тестировал последние версии Chrome, Firefox, а также IE 11 и Edge. Я попытался установить заголовок только с именем файла * = utf-8''texturlencoded.pdf, установив его с именем файла = text.pdf; имя файла * = UTF-8''texturlencoded.pdf. Ни одна из функций Rfc5987 / 8187, по-видимому, не обрабатывается правильно ни в одном из вышеперечисленных.

Это хорошее обновление. Можете ли вы рассказать о конкретных тестах, которые вы пробовали?
— Брэд

3

PHP фреймворк Symfony 4 имеет $filenameFallbackв HeaderUtils::makeDisposition. Вы можете посмотреть на эту функцию для деталей - это похоже на ответы выше.

Пример использования:

$filenameFallback = preg_replace('#^.*\.#', md5($filename) . '.', $filename);
$disposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename, $filenameFallback);
$response->headers->set('Content-Disposition', $disposition);

1

Классическое решение ASP

Большинство современных браузеров поддерживают передачу Filenameкак UTF-8сейчас, но, как и в случае с решением для выгрузки файлов, которое я использую и которое основано на FreeASPUpload.Net (сайт больше не существует, ссылки на archive.org ), оно не будет работать в качестве парсера Двоичный метод полагался на чтение однобайтовых строк в кодировке ASCII, что прекрасно работало, когда вы передавали данные в кодировке UTF-8, пока не получили символы, которые ASCII не поддерживает.

Однако я смог найти решение, чтобы заставить код читать и анализировать двоичный файл как UTF-8.

Public Function BytesToString(bytes)    'UTF-8..
  Dim bslen
  Dim i, k , N 
  Dim b , count 
  Dim str

  bslen = LenB(bytes)
  str=""

  i = 0
  Do While i < bslen
    b = AscB(MidB(bytes,i+1,1))

    If (b And &HFC) = &HFC Then
      count = 6
      N = b And &H1
    ElseIf (b And &HF8) = &HF8 Then
      count = 5
      N = b And &H3
    ElseIf (b And &HF0) = &HF0 Then
      count = 4
      N = b And &H7
    ElseIf (b And &HE0) = &HE0 Then
      count = 3
      N = b And &HF
    ElseIf (b And &HC0) = &HC0 Then
      count = 2
      N = b And &H1F
    Else
      count = 1
      str = str & Chr(b)
    End If

    If i + count - 1 > bslen Then
      str = str&"?"
      Exit Do
    End If

    If count>1 then
      For k = 1 To count - 1
        b = AscB(MidB(bytes,i+k+1,1))
        N = N * &H40 + (b And &H3F)
      Next
      str = str & ChrW(N)
    End If
    i = i + count
  Loop

  BytesToString = str
End Function

Кредит идет на Чистую Выгрузку Файла ASP , реализуя BytesToString()функцию из include_aspuploader.aspмоего собственного кода, который я смог заставить UTF-8работать с именами файлов.


Полезные ссылки


-1

У нас была похожая проблема в веб-приложении, и в итоге мы прочитали имя файла из HTML <input type="file">и установили его в закодированной форме в новом HTML <input type="hidden">. Конечно, нам пришлось удалить путь типа «C: \ fakepath \», который возвращают некоторые браузеры.

Конечно, это не дает прямого ответа на вопрос ОП, но может быть решением для других.


1
Совершенно другой вопрос. Вопрос о загрузке , ваш ответ о загрузке .
— Оскар Берггрен

-3

Я обычно URL-кодирую (с% xx) имена файлов, и это, кажется, работает во всех браузерах. Вы могли бы хотеть сделать некоторые тесты так или иначе.


10
Я провел тестирование в нескольких, и это не работает таким образом во всех браузерах, таким образом, вопрос. :)
— Атиф Азиз
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.