#java #spring #image #file-io #inputstream
#java #spring #изображение #file-io #входной поток
Вопрос:
Я хочу вернуть ссылку на изображение (или само изображение) при выполнении GET
-запроса. Я увидел руководство от Baeldung и решил его использовать. Код выглядит следующим образом:
@RequestMapping(value = "/image-manual-response", method = RequestMethod.GET)
public void getImageAsByteArray(HttpServletResponse response) throws IOException {
InputStream in = servletContext.getResourceAsStream("/WEB-INF/images/image-example.jpg");
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
IOUtils.copy(in, response.getOutputStream());
}
Поскольку я не мог понять, что servletContext
такое, и найти нужную мне информацию, я немного изменил метод:
@GetMapping("/image")
public void getImageAsByteArray(HttpServletResponse response) throws IOException {
InputStream in = new ByteArrayInputStream(("C:\Users\vartanyan\Desktop\images\Puer").getBytes());
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
IOUtils.copy(in, response.getOutputStream());
}
В результате в Swagger я получил следующее:
И когда я открываю изображение в отдельном окне, я получаю следующее:
Как можно исправить эту проблему? Я пишу Rest
MVC
приложение, используя Spring Boot
, Hibernate
, PostgreSQL
.
Ответ №1:
Попробуйте этот код:
@GetMapping("/image")
public void getImageAsByteArray(HttpServletRequest request, HttpServletResponse response) throws IOException {
InputStream in = request.getServletContext().getResourceAsStream("C:\Users\vartanyan\Desktop\images\Puer");
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
IOUtils.copy(in, response.getOutputStream());
}
Комментарии:
1. Указатель нуля. Переменная
in
=null
Ответ №2:
Получите ServletContext из запроса, вот так:
@GetMapping("/image")
public void getImageAsByteArray(HttpServletRequest request, HttpServletResponse response) throws IOException {
InputStream in = request.getServletContext().getResourceAsStream("images/Puer.jpg");
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
IOUtils.copy(in, response.getOutputStream());
}
Комментарии:
1.
NullPointer
в переменнойin
2. Вам нужно поместить свой файл в контекст приложения (в ваш war / jar)
3. в ресурсах?
4. Я добавил папку с изображениями в
resources
папку. Теперь путь выглядит так:C:UsersvartanyanIdeaProjectsCoffeeteareasrcmainresourcesimagesPuer.jpg
но также и NullPointer. По идее это выглядит так:InputStream in = request.getServletContext().getResourceAsStream("C:\Users\vartanyan\IdeaProjects\Coffeetearea\src\main\resources\images\Puer.jpg");
5.
InputStream in = request.getServletContext().getResourceAsStream("images/Puer.jpg");
не работает
Ответ №3:
Я добавляю FileInputStream()
реализацию. Например:
public void getDrinkImage(HttpServletResponse response, Long drinkId) throws IOException {
String imageURL = drinkRepository.getById(drinkId).getImage();
InputStream in = new FileInputStream(uploadPath imageURL);
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
IOUtils.copy(in, response.getOutputStream());
}