我正在使用Spring MVC 3.2.2.RELEASE,这是我第一次尝试使用基于Spring的Java配置(@Configuration
)。
我有一个控制器,用于处理某些文件。我的服务方法MyContentService.getResource(String)
读取文件的内容。目前,内容类型始终为text/html
。
如何配置我的Spring MVC应用程序,以便正确设置返回内容的类型?内容类型只能在运行时确定。
此刻我的控制器错误地始终将类型设置为text/html
:
@Controller
public class MyContentController {
MyContentService contentService;
@RequestMapping(value = "content/{contentId}")
@ResponseBody
public byte[] index(@PathVariable String contentId) {
return contentService.getResource(contentId);
}
}
修改
以下方法有效(使用PNG和JPEG文件),但我不满意URLConnection
确定内容类型(例如PDF,SWF等):
@RequestMapping(value = "content/{contentId}/{filename}.{ext}")
public ResponseEntity<byte[]> index2(@PathVariable String contentId, @PathVariable String filename, @PathVariable String ext, HttpServletRequest request) throws IOException {
byte[] bytes = contentService.getResource(contentId);
String mimeType = URLConnection.guessContentTypeFromName(filename + "." + ext);
if (mimeType != null) {
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.valueOf(mimeType));
return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
} else {
logger.warn("Unable to determine the mimeType for " + getRequestedUrl(request));
return new ResponseEntity<byte[]>(HttpStatus.NOT_FOUND);
}
}
答案 0 :(得分:2)
目前,您只返回一个byte[]
,其中不包含大量信息,仅包含实际内容(作为byte[]
)。
您可以将byte[]
打包在HttpEntity
或ResponseEntity
中,并在其上设置相应的内容类型。 Spring MVC将使用实体的内容类型将实际内容类型设置为响应。
要确定文件类型,您可以使用FileTypeMap
框架的javax.activation
或使用库(请参阅Getting A File's Mime Type In Java)。
@RequestMapping(value = "content/{contentId}")
@ResponseBody
public HttpEntity index(@PathVariable String contentId) {
String filepath = // get path to file somehow
String contentType = FileTypeMap.getDefaultFileTypeMap().getContentType(filePath);
byte[] content = contentService.getResource(contentId);
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.valueOf(mimeType));
return new HttpEntity(content, headers);
}