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();