Ответ 1
Использовать кавычки:
resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
У меня есть эта часть кода:
resp.addHeader("Content-Disposition", "inline; filename=" + fileName);
Когда имя файла "a_b_c.doc" или "abc.doc", имя загруженного файла отображается правильно. Однако, когда имя файла "b c.doc", имя загруженного файла является "a".
Как мы можем это решить?
Использовать кавычки:
resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
Согласно стандарту HTTP вы заключаете строку в двойные кавычки и избегаете любых кавычек или обратной косой черты внутри, предшествуя им одной обратной косой чертой.
Content-Disposition: attachment; filename="Very \"interesting\" file \\ files.txt"
Это предложит сохранить как Very "interesting" file\files.txt
. Обратите внимание, что наличие обратной косой черты не предполагает наличие папки, а предполагает, что обратная косая черта является частью имени файла (что совершенно верно для Linux и некоторых других платформ, но не для Windows).
если вы укажете свое имя файла с помощью chr(34)
, он будет работать:
resp.addHeader("Content-Disposition", "inline; filename=" + chr(34) + fileName + chr(34));
Требуются следующие шаги:
+
качестве кодированного пространства вместо %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
Успешно протестировано с