Не могу скачать файл на русском Spring MVC
Пытаюсь скачивать файлы названием у которых английское - проблем нет. Но когда название файла на русском, spring выводит мне само изображение и так же ошибку. Но у меня возник конкретные вопросы, могу ли я как-то это исправить и является ли такое поведение вообще "нормой" как бы странно это не звучало, просто когда я гуглил эту тему, я не особо то и смог найти какое-то решение, вот код:
@GetMapping("/download/{fileId}")
public void downloadFile(@PathVariable(value = "fileId") long fileId, Model model, HttpServletResponse response) {
FileEntity fileEntity = fileService.findById(fileId);
System.setProperty("file.encoding", "UTF-8");
if (fileEntity.getName().indexOf(".doc")>-1) response.setContentType("application/msword");
if (fileEntity.getName().indexOf(".docx")>-1) response.setContentType("application/msword");
if (fileEntity.getName().indexOf(".xls")>-1) response.setContentType("application/vnd.ms-excel");
if (fileEntity.getName().indexOf(".csv")>-1) response.setContentType("application/vnd.ms-excel");
if (fileEntity.getName().indexOf(".ppt")>-1) response.setContentType("application/ppt");
if (fileEntity.getName().indexOf(".pdf")>-1) response.setContentType("application/pdf");
if (fileEntity.getName().indexOf(".zip")>-1) response.setContentType("application/zip");
if (fileEntity.getName().indexOf(".png")>-1) response.setContentType("image/png");
if (fileEntity.getName().indexOf(".jpg")>-1) response.setContentType("image/jpg");
log.info(response.getContentType());
response.setHeader("Content-Disposition", "attachment; filename=" + fileEntity.getName());
response.setHeader("Content-Transfer-Encoding", "binary");
response.setCharacterEncoding("UTF-8");
try {
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
FileInputStream fis = new FileInputStream(UPLOAD_FOLDER + fileEntity.getUuid() + "." + fileEntity.getName());
int len;
byte[] buf = new byte[1024];
while((len = fis.read(buf)) > 0) {
bos.write(buf,0,len);
}
bos.close();
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
тут происходит само скачивание файла из папки, как сказал ранее, если название файла на английском - всё хорошо, у меня есть небольшая идея но я не принимаю это за решение так как не знаю является ли это правильным решение, суть решения такова, проверять название файла на наличие английских букв, если название на английском - допускать файл, именно по этому моё решение мне кажется таким себе, в ошибки как я понял проблема неким образом связанна с кодировкой, вот ошибка:
java.lang.IllegalArgumentException: The Unicode character [С] at code point [1,057] cannot be encoded as it is outside the permitted range of 0 to 255
The HTTP response header [Content-Disposition] with value [attachment; filename=Снимокэкрана(1).png] has been removed from the response because it is invalid
Ещё есть очень важный момент, ошибка появляется в тот момент, когда я пытаюсь скачать этот файл, это очень важно, я не пытаюсь заставлять здесь кого-то писать код за меня или что-то вроде такого, не подумайте. Я просто хотел бы какую-нибудь наводку или догадку с чем бы это могло быть связанно.
Мои вопросы озвучу снова:
- Является ли такое поведение "нормой", то есть могу ли я как-нибудь повлиять на то чтобы я мог скачивать файлы у которых название состоит из русской кириллицы?
- В какую конкретно сторону мне копать, то есть что мне конкретно искать в качестве решения? смена кодировки или что-то ещё?