Кириллица в имени скачиваемого файла
В заметке рассказывается о том, как можно отдать файл с кириллицей в имени так, чтобы его имя было корректно распознано браузером.
HTTP заголовок Content-Disposition
указывает браузеру на то, как должен отображаться контент ответа: как веб-страница, ее часть или скачано как вложение.
В последнем случае, заголовок имеет значение attachment
и может включать имя файла:
Content-Disposition: attachment Content-Disposition: attachment; filename="report.xlsx"
В случае, если необходимо включить в имя файла не ASCII символы, например кириллицу, можно закодировать символы в UTF-8 и специальным образом указать на это браузеру:
attachment; filename*=UTF-8''%D1%84%D0%B0%D0%B9%D0%BB.txt
Для того чтобы закодировать имя файла в UTF-8 можно воспользоваться классом URLEncoder из стандартной библиотеки Java:
String fileName = URLEncoder.encode("файл.txt", StandardCharsets.UTF_8);
Или, в случае если в проекте используется Spring 5+, то можно воспользоваться средствами, предусмотренными фреймворком:
ContentDisposition contentDisposition = ContentDisposition.builder("attachment") .filename(filename, UTF_8) .build(); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentDisposition(contentDisposition); return ResponseEntity.ok() .headers(httpHeaders) .contentType(APPLICATION_OCTET_STREAM) .contentLength(file.length) .body(new ByteArrayResource(file));