2015-12-02 140 views
0

我正在尝试创建一个java REST服务,它将下载word文档。文件下载但内容只是垃圾十六进制,而不是实际的Word文档内容。我的示例代码如下。我错过了什么?文件之后的&具有相同数量的字节。REST服务发送损坏的文件

@SuppressWarnings("resource") 
@RequestMapping(value = "get/testdoc", method=RequestMethod.GET, produces="application/octet-stream) 
public @ResponseBody ResponseEntity<byte[]> getTestDoc() throws Throwable{ 

    File doc = new File("C:\\temp\\file.doc"); 

    InputStream is = new FileInputStream(doc); 
    byte[] bytes = IOUtils.toByteArray(is); 

    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
    responseHeaders.set("Content-Disposition" , "Attachment; filename=file.doc"); 
    responseHeaders.setContentLength(ProposalDoc.length()); 



    return new ResponseEntity<byte[]>(bytes, responseHeaders, HttpStatus.OK); 
} 
+2

你怎么确定下载的文件是“垃圾十六进制”?你有没有试图用Word打开它?此外,指定您使用的是哪个版本的Spring会很有帮助。 – Pyranja

+0

如果不指定八位位组流和内容长度,该怎么办? –

+0

我用word打开了文件。使用Spring 3.1.1。这需要在下载之前进行Base64编码吗? –

回答

0

感谢所有帮助。我最终绕过了将文件附加到响应的Spring &,如下面的代码所示。我怀疑冲刺是在幕后转换字节。我看着配置ByteArrayHttpMessageConverter,但似乎没有帮助。现在这对我来说已经足够了。

@SuppressWarnings("resource") 
@RequestMapping(value = "get/doc", method=RequestMethod.GET, produces="application/octet-stream") 
    public HttpEntity getProposalDocs(HttpServletResponse response) throws Throwable{ 
     File doc = new File("C:\\temp\\file.doc"); 

     InputStream is = new FileInputStream(doc); 

     response.setHeader("Content-Disposition", "attachment;filename=\"test.doc\""); 
     response.setHeader("Content-Type", "application/octet-stream;"); 
     StreamUtils.copy(is ,response.getOutputStream()); 

     return new ResponseEntity(HttpStatus.OK); 
    } 
1

我觉得有两个问题:

1. Length头:

我我看来至少有一个很奇怪的一行:

responseHeaders.setContentLength(ProposalDoc.length()); 

我认为应该是:

responseHeaders.setContentLength(bytes.length); 

2. @ResponseBody注释

如果您使用的返回类型ResponseEntity<byte[]>,那么你一定不能添加@ResponseBody

@RequestMapping(value = "get/testdoc", method=RequestMethod.GET) 
public ResponseEntity<byte[]> getTestDoc() throws Throwable{ 
    ... 
} 
+0

我更新了这一行。同样的结果。 –

+0

@史密斯先生:看看第二个问题 – Ralph

+0

谢谢。我删除了@ResponseBody注释,但我有同样的问题。 –

0

尝试更换产生= “应用程序/八位字节流”) 与生产= “应用程序/ vnd.ms字”)

+0

没有帮助........ –

+0

和下载前文件打开好吗?位于以下位置的文件:C:\\ temp \\ file.doc? –

+0

是的。该文件在下载前打开。一些编码问题可能? –

0

查看此代码也适用于我。

@RequestMapping(value = "/get/doc" , method = RequestMethod.GET , 
    produces = "application/msword") 
    public ResponseEntity<InputStreamResource> getProposalDocs() throws IOException{ 
    ClassPathResource docfile = new ClassPathResource("file.doc"); 
    HttpHeaders headers 

= new HttpHeaders(); 
    headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); 
      headers.add("Pragma", "no-cache"); 
      headers.add("Expires", "0"); 
     return ResponseEntity.ok() 
       .headers(headers) 
       .contentLength(docfile.contentLength()) 
       .contentType(MediaType.parseMediaType("application/msword")) 
       .body(new InputStreamResource(docfile.getInputStream())); 
    } 

EDITED:与我合作返回InputStreamResource而不是byte []的想法。 还指定内容类型为produce =“application/octet-stream”。

这正常工作与我没有必要绕过servlet响应..

+0

添加一些文字说明您的答案如何解决OP当前问题并帮助其他具有相同问题的人。谢谢 –