Подтвердить что ты не робот

Как установить имя файла, содержащее пробелы в заголовке Content-Disposition

У меня есть эта часть кода:

resp.addHeader("Content-Disposition", "inline; filename=" + fileName);

Когда имя файла "a_b_c.doc" или "abc.doc", имя загруженного файла отображается правильно. Однако, когда имя файла "b c.doc", имя загруженного файла является "a".

Как мы можем это решить?

4b9b3361

Ответ 1

Использовать кавычки:

resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");

Ответ 2

Согласно стандарту HTTP вы заключаете строку в двойные кавычки и избегаете любых кавычек или обратной косой черты внутри, предшествуя им одной обратной косой чертой.

Content-Disposition: attachment; filename="Very \"interesting\" file \\ files.txt"

Это предложит сохранить как Very "interesting" file\files.txt. Обратите внимание, что наличие обратной косой черты не предполагает наличие папки, а предполагает, что обратная косая черта является частью имени файла (что совершенно верно для Linux и некоторых других платформ, но не для Windows).

Ответ 3

если вы укажете свое имя файла с помощью chr(34), он будет работать:

resp.addHeader("Content-Disposition", "inline; filename=" + chr(34) + fileName + chr(34));

Ответ 4

Требуются следующие шаги:

  • URI-кодирование имени файла
  • Замените пробелы в зашифрованном имени файла (мы используем кодировщик URL вместо кодировщика URI, но кодировка URL использует + качестве кодированного пространства вместо %20, поэтому мы должны вручную заменить их на %20).
  • Установите закодированное имя файла в заголовке. Здесь у нас есть два варианта: один, который задает кодировку, а другой - нет. Для максимальной совместимости мы можем указать оба.

Код:

String fileName = ...;
String encodedFileName = URLEncoder.encode(fileName, 
    StandardCharsets.UTF_8.name()).replace("+", "%20");

response.setHeader("Content-Disposition", 
    String.format("inline; filename*=UTF-8''%1$s; filename=%1$s", encodedFileName));

Пример заголовка: inline; filename*=UTF-8''Hello%20World.doc; filename=Hello%20World.doc inline; filename*=UTF-8''Hello%20World.doc; filename=Hello%20World.doc

Успешно протестировано с

  • Firefox ✔
  • Хром ✔
  • Край ✔
  • Internet Explorer ✔