Java
April 16

Кириллица в имени скачиваемого файла

В заметке рассказывается о том, как можно отдать файл с кириллицей в имени так, чтобы его имя было корректно распознано браузером.

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