Как закодировать параметр имени файла заголовка 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 .

MVG
источник
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 Исправлено

martinoss
источник
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.'"');
Stano
источник
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 в имени файла.

apurkrt
источник
... но максимальная длина передаваемого имени файла также зависит от клиента. Только что обнаружил, что самое большее [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вместо этого.

Gustav
источник
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, по-видимому, не обрабатывается правильно ни в одном из вышеперечисленных.
user1664043
источник
Это хорошее обновление. Можете ли вы рассказать о конкретных тестах, которые вы пробовали?
Брэд
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работать с именами файлов.


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

Lankymart
источник
-1

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

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

Андрей I
источник
1
Совершенно другой вопрос. Вопрос о загрузке , ваш ответ о загрузке .
Оскар Берггрен
-3

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

Дарио Солера
источник
10
Я провел тестирование в нескольких, и это не работает таким образом во всех браузерах, таким образом, вопрос. :)
Атиф Азиз