Spring MVC - 设置byte [] @ResponseBody的内容类型

时间:2014-08-27 12:30:12

标签: java spring spring-mvc web-applications

我正在使用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);
    }
}

1 个答案:

答案 0 :(得分:2)

目前,您只返回一个byte[],其中不包含大量信息,仅包含实际内容(作为byte[])。

您可以将byte[]打包在HttpEntityResponseEntity中,并在其上设置相应的内容类型。 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);
}