SpringMVC:如何从控制器返回图像?

SpringMVC:如何从控制器返回图像?,spring,spring-mvc,Spring,Spring Mvc,我试图返回这样的图像 @RequestMapping(value = "admin/image/{userId}") public ResponseEntity<byte[]> getPhoto(@PathVariable int userId) throws IOException { UserDB userDB = UserDBService.getUserWithId(userId); if (userDB != null) { try {

我试图返回这样的图像

 @RequestMapping(value = "admin/image/{userId}")
public ResponseEntity<byte[]> getPhoto(@PathVariable int userId) throws IOException {
    UserDB userDB = UserDBService.getUserWithId(userId);
    if (userDB != null) {
        try {
            byte[] image;
            try {
                String path = ApplicationPropertiesConstants.SAFESITE_DOCUMENTS_DIRECTORY + userDB.getSite().getId() + "\\342.png";
                InputStream is = new FileInputStream(path);
                BufferedImage img = ImageIO.read(is);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ImageIO.write(img, "png", bos);
                final HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.IMAGE_PNG);

                return new ResponseEntity<byte[]>(IOUtils.toByteArray(is), headers, HttpStatus.CREATED);
            } catch (FileNotFoundException e) {
                image = org.apache.commons.io.FileUtils.readFileToByteArray(new File("dfd"));
            }

            return null;
        } catch (IOException ignored) {
        }
    }
    return null;
}
@RequestMapping(value=“admin/image/{userId}”)
公共响应属性getPhoto(@PathVariable int userId)引发IOException{
UserDB UserDB=UserDBService.getUserWithId(userId);
if(userDB!=null){
试一试{
字节[]图像;
试一试{
字符串路径=ApplicationPropertiesConstants.SAFESITE\u DOCUMENTS\u目录+userDB.getSite().getId()+“\\342.png”;
InputStream is=新文件InputStream(路径);
BuffereImage img=图像IO.read(is);
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
ImageIO.write(img,“png”,bos);
最终HttpHeaders=新HttpHeaders();
headers.setContentType(MediaType.IMAGE\u PNG);
返回新的ResponseEntity(IOUtils.toByteArray(is)、headers、HttpStatus.CREATED);
}catch(filenotfounde异常){
image=org.apache.commons.io.FileUtils.readFileToByteArray(新文件(“dfd”);
}
返回null;
}捕获(忽略IOException){
}
}
返回null;
}
虽然当我访问url时,图像不会显示

知道为什么会这样吗?我需要使用Apache Tiles吗?目前我正在使用jstlView

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

这样不行,你需要这样的东西

@RequestMapping(...)
void getImage(...) {
  response.setContentType(mimeType);
  response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() +"\""));
  response.setContentLength((int)file.length());
  InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
  FileCopyUtils.copy(inputStream, response.getOutputStream());
}

获取图像文件并将其写入响应

@RequestMapping(value = "/getImage", method = RequestMethod.GET)
  public void showImage(HttpServletResponse response) throws Exception {

    ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();

    try {
      BufferedImage image = //CALL_OR_CREATE_YOUR_IMAGE_OBJECT;
      ImageIO.write(image, "jpeg", jpegOutputStream);
    } catch (IllegalArgumentException e) {
      response.sendError(HttpServletResponse.SC_NOT_FOUND);
    }

    byte[] imgByte = jpegOutputStream.toByteArray();

    response.setHeader("Cache-Control", "no-store");
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Expires", 0);
    response.setContentType("image/jpeg");
    ServletOutputStream responseOutputStream = response.getOutputStream();
    responseOutputStream.write(imgByte);
    responseOutputStream.flush();
    responseOutputStream.close();
  }
}


您得到了什么响应?加载响应数据失败如果您有一个
InputStream
无论如何,您可以返回一个
ResponseEntity
,主体为
new-InputStreamResource(InputStream)
。如果您使用
byte[]
您应该设置内容长度标题。正确的状态是
HttpStatus。好的
btw。我不确定你所说的身体是新的InputStreamResource(inputStream)是什么意思。人们肯定是按照我的方式(返回一个字节数组)完成的(返回一个字节数组),或者在这里看到@OneTwo肯定,我看到了你的问题,你应该使用
返回新的ResponseEntity(bos.toByteArray(),headers,HttpStatus.CREATED)好的,这成功了,谢谢。如果我知道我想做同样的事情,但会返回任何类型的文件(作为下载链接),我该怎么做?要返回任何文件,如图像、pdf或下载链接,必须设置标题。例如:下载链接字符串mimeType=“应用程序/八位字节流”;response.setContentType(mimeType);response.setHeader(“内容处置”,String.format(“内联;文件名=\”+文件名()+”\”);Pdf link response.setContentType(“application/Pdf”);setHeader(“内容处置”、“内联;文件名=“+”form.pdf”);请添加一些细节和解释,以便帮助他人
response.setContentType("text/plain");
response.setHeader("Content-Disposition", "attachment;filename=EDC-"+ title + ".txt");
ServletOutputStream out = response.getOutputStream();
out.print(myString.trim());
out.flush();
out.close();