Я хочу открыть свой сервлет, который в основном проверяет мои разрешения и, если разрешено, показывает мне картинку, как будто это настоящий jpeg. Мой код на данный момент:

File file = new File("C:/test.jpeg");
FileInputStream fis = new FileInputStream(file);
byte imageBytes[] = new byte[(int) file.length()];
    
response.setContentType("image/jpeg");
response.setContentLength(imageBytes.length);
response.getOutputStream().write(imageBytes);
response.getOutputStream().flush();

Но каким-то образом изображение, которое он пытается показать мне в браузере, повреждено. Я уже проверил, существует ли файл, так как длина изображения не равна нулю. Что я сделал не так?

-1
wernersbacher 4 Дек 2020 в 11:40

1 ответ

Лучший ответ

Вам следует начать использовать более новый NIO.2 File API, который был добавлен в Java 7, в основном Files, потому что это значительно упрощает работу.

Вариант 1: Загрузить файл в байт []

byte[] imageBytes = Files.readAllBytes(Paths.get("C:/test.jpeg"));

response.setContentType("image/jpeg");
response.setContentLength(imageBytes.length);
try (OutputStream out = response.getOutputStream()) {
    out.write(imageBytes);
}

Вариант 2 . Потоковая передача файла без использования большого количества памяти (рекомендуется)

Path imageFile = Paths.get("C:/test.jpeg");
response.setContentType("image/jpeg");
response.setContentLength((int) Files.size(imageFile));
try (OutputStream out = response.getOutputStream()) {
    Files.copy(imageFile, out);
}
1
Andreas 4 Дек 2020 в 08:57