5

メディア (画像、css、js など) のバイトをクライアントに単純にストリーミングするコントローラー メソッドがあります。私は最初に次のようなことを試しました:

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
@ResponseBody
public byte[] getMedia(HttpServletRequest request) throws IOException
{
    //logic for getting path to media on server

    return Files.readAllBytes(Paths.get(serverPathToMedia));
}

私は最初にこれを Firefox でテストしましたが、すべて正常に動作しているように見えました。ただし、Chrome で試してみたところ、どの画像も機能しないことがわかりました。それで、私はそれを次のように変更しました:

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
public ResponseEntity<byte[]> getMedia(HttpServletRequest request) throws IOException
{
    //logic for getting path to media on server

    byte[] bytes = Files.readAllBytes(Paths.get(serverPathToMedia));
    //logic for setting some header values like Content-Type and Content-Length
    return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
}

これにより、以前と同じ結果が得られました。開発者ツールで、応答ヘッダーが期待どおりにダウンしているのを見ましたが、まだ画像バイトはありません

次に、次のようなことを試しました。

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
public void getMedia(HttpServletRequest request, HttpServletResponse response) throws IOException
{
    //logic for getting path to media on server

    byte[] bytes = Files.readAllBytes(Paths.get(serverPathToMedia));
    response.getOutputStream().write(bytes);
}

応答ヘッダーを設定しなくても、これは Firefox と Chrome で機能します。今、私はこの最後の方法でそれを行うことができますが、これはSpring MVCの正しい方法とは思えません。私が試した最初の 2 つのことがうまくいかなかった理由を知りたいです。また、実際にこれを行う正しい方法である、私が試していないことはありますか?

4

1 に答える 1

5

あなたの最後のアプローチは、それを行うためのほとんどの方法です。私が提案できる唯一の変更は、コンテンツ ファイル全体をメモリにストリーミングするのではなく、バッファリングを使用してコンテンツをストリーミングすることです。Apache commons のIOUtilsでこれを行うことができます。

于 2012-12-22T20:52:08.757 に答える