使用ResponseBody下载spring文件

时间:2013-01-23 00:01:45

标签: java spring

您好我正在尝试创建一个允许我托管任何类型文件的应用程序。 为了做到这一点,我正在执行以下魔术:

@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
    @ResponseBody
    public FileSystemResource 
    getFile(
            @PathVariable("file_name") String fileName) {
        System.out.println(fileName);
        String filePath = "./files/";
        return new FileSystemResource(new File(filePath+fileName)); 
    }

但这种方法带来了三个不必要的问题:

  1. 一些随机数据被附加到文件

  2. 该文件在浏览器窗口中打开而不是出现         下载 - 我试图用

    之类的东西破解它

    produce =“application / octet-stream”

    但它只导致406错误。

  3. test.txt被截断到测试中,我找到了一个解决方法,为应用程序提供test.txt /作为fileName,但它看起来有点乱。

2 个答案:

答案 0 :(得分:1)

正如spring manual

所述
  

与@RequestBody一样,Spring将返回的对象转换为   使用HttpMessageConverter

响应正文

我认为你的问题是Spring没有HttpMessageConverter,而不能处理FileSystemResource。

A list of builtin HttpMessageConverter is available here。我建议你尝试以某种方式将你的响应转换为字节数组,也许它会选择ByteArrayHttpMessageConverter来帮助解决你的问题

答案 1 :(得分:0)

我使用这样的代码返回图像

@RequestMapping(value = "/image/{id}", method = RequestMethod.GET)
public String getImage(... HttpServletResponse response) {
      response.setContentType(image/png);
      (response.getOutputStream()).write(imageByteArray);
}

我认为你必须定义适当的mime类型并将数据发送到响应。