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


534

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

Content-Disposition: attachment; filename=FILENAME

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

Поточна граматика [RFC 2045] обмежує значення параметрів (і, отже, назви файлів вмісту) на US-ASCII. Ми визнаємо велику бажаність дозволу довільних наборів символів у назви файлів, але це визначає необхідні механізми за межами цього документа.

Однак є емпіричні докази того, що більшість популярних веб-браузерів сьогодні, здається, дозволяють символи, які не належать до США та ASCII, (за відсутності стандарту) не погоджуються щодо схеми кодування та специфікації набору символів для імені файлу. Питання полягає в тому, які різні схеми та кодування використовуються популярними браузерами, якщо ім'я файлу “naivef” (без лапок та де третя літера є U + 00EF) потрібно закодувати у заголовок Content-Disposition?

Для цього питання популярними браузерами є:

  • Firefox
  • Internet Explorer
  • Сафарі
  • Гугл хром
  • Опера

Зрозуміло, що він працює для Mobile Safari (raw utf-8, як запропонував @Martin Ørding-Thomsen), але це не працює для GoodReader з того самого пристрою. Будь-які ідеї?
Тіло

Дивіться також подібне запитання
juergen d

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-закодованим). Тоді файл Naxt файла.txt стає:

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

Сафарі (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, використовуючи для завантаження це ім’я файлу: 你好 abcABCæøåÆØÅäöüïëêîâéíáóúýý½§! # ¤% & () = `@ £ $ € {[]} + ´¨ ^ ~ '-_,;., 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.
Мартін Турной

20
Чому б не поєднати їх, як 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: вкладення; filename = "foo-% c3% a4.html"; ім'я файлу * = UTF-8''foo-% c3% a4.html Вказівка ​​fileName двічі (один раз без префікса UTF-8 та один раз з) змушує його працювати в IE8-11, Edge, Chrome, Firefox та Safari ( здається, яблуко виправлене сафарі, тож воно працює і зараз)
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
це фантастичне рішення; дійсно мені дуже допомогли. Дякую.
kristopolous

6
Я спустився кроликом слід і спробував деякі інші рішення; намагання нюхати правильний веб-переглядач та версію, щоб правильно встановити заголовки - це занадто великий кошмар. Chrome неправильно ідентифікували як Safari, який не веде себе однаково (розривається на коми, якщо не закодовано правильно). Врятуйте собі неприємності, використовуйте це рішення та псевдонім URL за потребою.
1313

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
У Сафарі були проблеми. При завантаженні файлів з російськими іменами отримували помилкові та нечитабельні символи. Рішення допомогло. Але нам потрібно надіслати заголовок в одному рядку (!!!).
evtuhovdo

16

Наступний документ, пов’язаний із проектом RFC, згаданим Джимом у своїй відповіді, далі розглядає це питання і, безумовно, варто звернути увагу тут:

Тестові випадки для заголовка вмісту-диспозиції HTTP та кодування 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

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 ) );
}

Java:

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, тому декілька символів можна скасувати
Brett Zamir

10

Поставте ім'я файлу в подвійні лапки. Вирішили проблему для мене. Подобається це:

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

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

Я перевірив кілька варіантів. Браузери не підтримують характеристики та діють по-різному, я вважаю, що подвійні цитати - найкращий варіант.


3
Це, на жаль, не вирішує всіх проблем, пояснених у відповідях вище.
Лука Стіб

2
Це дозволить вам повернути ім'я файлу з пробілами, &, %, і #т.д. Таким чином , він вирішує , що.
Дон Чідл

Що робити, якщо ім'я файлу містить подвійні лапки (так, це може статися), Як зазначено в RFC 6266, ім'я файлу є "котированим рядком", і як зазначено в RFC 2616, подвійні лапки в межах рядка з цитатами слід уникати з зворотним нахилом.
Крістоф Руссі

9

У веб-API ASP.NET я URL-адреса кодує ім'я файлу:

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 імені файлу, з підкресленнями символів, які не є в цьому кодуванні.

Заключна примітка: макс. розмір для кожного поля заголовка - 8190 байт в апачі. UTF-8 може містити до чотирьох байт на символ; після rawurlencode, це x3 = 12 байт на один символ. Досить неефективно, але теоретично все одно можна мати більше 600 "посмішок"% F0% 9F% 98% 81 у назві файлу.


... але максимальна довжина імені файлу також залежить від клієнта. Щойно з’ясували, що максимум [89 усмішок😁] .pdf-ім'я файлу потрапляє через MSIE11. У Firefox37 це не більше [111x 😁] .pdf. Chrome41 обрізає ім'я файлу на 110-й усмішці. Цікаво, що суфікс передається нормально.
apurkrt

5

Якщо ви використовуєте nodejs backkend, ви можете використовувати наступний код, який я знайшов тут

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" vs. encodeURI('"Kornél Kovács 1/1/2016')=> "Kornél Kovács 01.01.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
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як він відповідає на це, значно покращить його довгострокове значення. Будь ласка , змініть свій відповідь , щоб додати деякі пояснення.
Toby Speight

2
Ого, жоден із вищезазначених відповідей, що стосуються лише коду, не був оскаржений або оскаржений таким чином. Також я знайшов причину, на яку вже відповіли досить добре: IE не інтерпретує ім'я файлу * = utf-8, але потребує ISO8859-1 версії імені файлу, яку пропонує цей сценарій. Тільки хотів надати ледачим робочий простий код для PHP.
Густав

Я думаю, що це було сприйнято тому, що питання не є мовним, а про те, до чого слід дотримуватися RFC при впровадженні кодування заголовка. Дякую, за цю відповідь, для PHP, цей код змусив мої неприємності.
j4k3

Дякую. Ця відповідь, можливо, не відповідала строго на питання, але саме це я шукав і допоміг мені вирішити проблему в Python.
Лінді Сімон

1
Я впевнений, що цей код може використовуватися як вектор атаки, якщо користувач може керувати іменем файлу.
Антті Хаапала

3

Просто оновлення, оскільки я намагався сьогодні всі ці речі у відповідь на питання клієнта

  • За винятком Safari, налаштованого на японську мову, усі браузери, які перевіряв наш клієнт, найкраще працювали з ім'ям файлу = text.pdf - де текст - це значення клієнта, серіалізоване 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зараз, але як це було у випадку рішення File Upload, яке я використовую, заснованого на FreeASPUpload.Net (сайт більше не існує, посилання на archive.org ) не буде працювати як синтаксичний аналіз binary покладався на читання однобайтових рядків, кодованих 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">та встановив його у кодованому URL-адресі у новому HTML <input type="hidden">. Звичайно, нам довелося видалити шлях на зразок "C: \ fakepath \", який повертається деякими браузерами.

Звичайно, це не відповідає безпосередньо на питання ОП, але може бути рішенням для інших.


1
Зовсім інше питання. Питання щодо завантаження , ваша відповідь - про завантаження .
Оскар Берггрен

-3

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


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