メディア (画像、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 つのことがうまくいかなかった理由を知りたいです。また、実際にこれを行う正しい方法である、私が試していないことはありますか?