2016-12-09 2 views
0

В моем контроллере Spring я написал метод, который возвращает изображения на странице JSP из папки ресурсов. Но если я изменяю ресурс (или), добавляю новый, то InputStream имеет значение NULL. Когда я перезагружаю приложение, он снова работает.Как получить изображения после загрузки в контроллер Spring без перезагрузки?

Что можно сделать для получения изображений без перезагрузки приложения?

мой метод в контроллере:

@ResponseBody 
    @RequestMapping(value = "/image/{authorUsername}/{title}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) 
    public byte[] testphoto(HttpServletRequest request, 
          @PathVariable("authorUsername") String authorUsername, 
          @PathVariable("title") String title) throws IOException { 
     InputStream in = servletContext.getResourceAsStream("/resources/uploadImages/zeus192/" + title + "/0.jpg"); 
     return IOUtils.toByteArray(in); 
    } 

на JSP странице:

<img src="/image/${advert.authorUsername}/${advert.title}/"> 

EDITED:

@ResponseBody 
    @RequestMapping(value = "/image/{authorUsername}/{title}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) 
    public void testphoto(HttpServletRequest request, HttpServletResponse response, 
             @PathVariable("authorUsername") String authorUsername, 
             @PathVariable("title") String title) throws IOException { 

     InputStream instream = servletContext.getResourceAsStream("/resources/uploadImages/zeus192/" + title + "/0.jpg"); 
     byte[] bytes = IOUtils.toByteArray(instream); 
     int contentLength = IOUtils.copy(new ByteArrayInputStream(bytes), response.getOutputStream()); 
     response.setContentLength(contentLength); 
     response.setHeader("Content-Disposition", "inline;filename=\"" + "0.jpg" + "\""); 
    } 

EDITED 2:

@ResponseBody 
@RequestMapping(value = "/image/{authorUsername}/{title}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) 
public void testphoto(HttpServletRequest request, HttpServletResponse response, 
            @PathVariable("authorUsername") String authorUsername, 
            @PathVariable("title") String title) throws IOException { 

    String contextPath = request.getSession().getServletContext().getRealPath(""); 
    String directory = contextPath.substring(0,contextPath.length() - 18) + "/target/YaPokupay/src/main/webapp/resources/uploadImages/" + authorUsername + "/" + title + "/0.jpg"; 

    File file = new File(directory); 
    String filePath = file.getPath(); // D:\Works\YaPokupay\target\YaPokupay\src\main\webapp\resources\uploadImages\zeus192\Картинка\0.jpg 
    InputStream instream = this.getClass().getClassLoader().getResourceAsStream(filePath); 

    byte[] bytes = IOUtils.toByteArray(instream); 
    int contentLength = IOUtils.copy(new ByteArrayInputStream(bytes), response.getOutputStream()); 
    response.setContentLength(contentLength); 

    response.setHeader("Content-Disposition", "inline;filename=\"" + "0.jpg" + "\""); 

} 

ответ

1

Это работает для меня Mutiple просьбе же resource.My ресурса в (../ProjectName/src/main/webapp/resources/images/logos)

@Autowired 
private ServletContext servletContext; 

@RequestMapping(value = "/sampleJavaOperation", method = RequestMethod.GET) 
    public void sampleJavaOperation(HttpServletRequest request, HttpServletResponse response) throws IOException { 

     InputStream instream = servletContext.getResourceAsStream("/resources/images/logos/wavemaker_62x62.png"); 
     byte[] bytes = IOUtils.toByteArray(instream); 
     int contentLength = IOUtils.copy(new ByteArrayInputStream(bytes), response.getOutputStream()); 
     response.setContentLength(contentLength); 
     response.setHeader("Content-Disposition", "inline;filename=\"" + "0.png" + "\""); 
    } 
+0

Что означает _ @ WMAccessVisibility (значение = AccessSpecifier.APP_ONLY) _ и _ @ ApiOperation (value = "") _? – Dmitry

+0

sry, это мои собственные аннотации. Обновленный код, и они не будут влиять на эту услугу. –

+0

Этот код работает так же: изображения, загруженные из целевой папки. – Dmitry

1

Вот код для загрузки файла с весны controller.Adding HttpServletResponse в качестве параметра и настройки вашего потока файла в выходной поток ответа.

@ResponseBody 
    @RequestMapping(value = "/image/{authorUsername}/{title}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) 
    public void testphoto(HttpServletRequest request,HttpServletResponse response, 
          @PathVariable("authorUsername") String authorUsername, 
          @PathVariable("title") String title) throws IOException { 
     InputStream in = servletContext.getResourceAsStream("/resources/uploadImages/zeus192/" + title + "/0.jpg"); 
     Byte[] bytes = IOUtils.toByteArray(in); 
     int contentLength = IOUtils.copy(new ByteArrayInputStream(bytes), response.getOutputStream()); 
     httpServletResponse.setContentLength(contentLength); 
    } 

Если вы хотите, чтобы сделать изображения в браузере, а затем добавить заголовок «Content-Disposition», как инлайн другое вложение, которое будет загрузить файл на локальном компьютере.

if(inline){ // if you want to attachment to be inline 
    response.setHeader("Content-Disposition", "inline;filename=\"" + fileName + "\""); 
}else{ 
    response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); 
} 
+0

мне нужно создать новый ответ? Или ответ и httpServletResponse - это то же самое? – Dmitry

+0

Где мне нужно добавить «Content-Disposition»? – Dmitry

+0

Используйте тот же параметр HttpServletResponse, который объявлен в параметрах для установки заголовка Content-Disposition. Обновленный код с ответом HTTP-сервлета. –

Смежные вопросы