2012-02-16 56 views
0

我想建立一个Spring控制器为来自URL的文件:如何从服务器URL的inputStream春季控制器

@RequestMapping(value = "/test", method = RequestMethod.GET) 
public ResponseEntity<byte[]> getFile() throws IOException { 
    CommonHttpClient client = new CommonHttpClient(); 
    URL url = new URL("http://www.google.com"); 
    InputStream stream = url.openStream(); 
    final HttpHeaders headers = new HttpHeaders(); 
    headers.add("Content-Type", "text/html"); 
    return new ResponseEntity<byte[]>(IOUtils.toByteArray(stream), headers, HttpStatus.CREATED); 
} 

我有ByteArrayHttpMessageConverter在我的bean配置AnnotationMethodHandlerAdaptor。

然而,当我把这个页面,我得到无意义的字符串像 “PHBYzT5QB ......” 的网址是绝对访问,并没有IOException异常被抛出。 我在这里错过了什么?

回答

1

我觉得你在这里混几件事情。如果你想在本地文件系统上提供的文件可用,那么你不需要从URL读取。如果你用HttpResponse参数定义你的方法签名,你将能够得到OutputStream并写入它。没有转换器是必要的 - 只需从一个流(文件)中读取并在循环中写入另一个流。为响应设置正确的内容类型标题也很重要。

@RequestMapping... 
public void getFile(HttpResponse resp) throws IOException { 
    InputStream is = ... // get InputStream from your file 
    resp.setContentType("text/html"); // or whatever is appropriate for your file 
    OutputStream os = resp.getOutputStream(); 
    // now read from one stream and write to the other 
    byte[] buffer = new byte[1024]; 
    int len = in.read(buffer); 
    while (len != -1) { 
    out.write(buffer, 0, len); 
    len = in.read(buffer); 
    } 
} 
+0

感谢您的回答。对不起,任何混淆,该文件确实是一个服务器。我会用www.google.com替换它以清楚说明。 IOUtils.toByteArray和你的代码完全一样,我也设置了内容类型。 – ltfishie 2012-02-16 04:09:24

+0

哇,我应该保持基本。使用HttpResponse确实有效。我会在稍后给你答案,但我想看看如何使用ResponseEntity 来完成这项工作,因为它在我阅读过的很多来源中都有提及。 – ltfishie 2012-02-16 04:30:06

+0

即使ResponseEntity的方法有效,我认为它会比使用流更差,因为整个文件需要同时保存在内存中,这对于大文件或更重要的请求速率来说是不可取的或不可能的 – maximdim 2012-02-16 12:07:06

0

我认为这是BASE编码的字节数组