2012-02-16 3 views
0

に私は、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); 
} 

私は豆の設定で私のAnnotationMethodHandlerAdaptorでByteArrayHttpMessageConverterを持っています。

しかし、私はこのページを呼び出すときに、私は のような無意味な文字列を取得しています「PHBYzT5QBを....」 URLは間違いなく到達可能であると何にIOExceptionがスローされませんでした。 私はここで何が欠けていますか?

答えて

1

だと思います。あなたが提供したいファイルがあなたのローカルファイルシステムで利用可能な場合は、URLから読み込む必要はありません。メソッドシグネチャをHttpResponseパラメータで定義すると、OutputStreamを取得して書き込むことができます。 1つのストリーム(ファイル)から読み込み、ループ内で別のストリーム(ファイル)に書き込むだけのコンバーターは必要ありません。また、正しいコンテンツタイプヘッダーを設定することも重要です。

@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はコードとまったく同じことを行い、content-typeも設定しました。 – ltfishie

+0

うわー、私は基本にとどまっていたはずです。 HttpResponseを使用して実際に動作します。私はあなたに答えを後で与えますが、これはResponseEntity でこれがどのように行われるのか見たいのですが、これは多くのソースで私が読んでいることから言われています。 – ltfishie

+0

ResponseEntityのアプローチが機能しても、ファイル全体が同時にメモリに保存される必要があるため、ストリームを扱うよりも劣っていると思います。大きなファイルや些細な要求に対しては望ましくないか不可能です。 – maximdim

0

私はあなたがここにいくつかのことを混合していると思いますこれはBASEエンコードされたバイト配列

関連する問題