ファイルのダウンロードを簡単な方法で書きました。
@ResourceMapping(value = "content")
public void download(ResourceRequest request, ResourceResponse response) {
//...
SerializableInputStream serializableInputStream = someService.getSerializableInputStream(id_of_some_file);
response.addProperty(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");
response.setContentType(contentType);
response.addProperty(HttpHeaders.CONTENT_TYPE, contentType);
response.addProperty(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''"
+ URLEncoder.encode(fileName, "UTF-8"));
OutputStream outputStream = response.getPortletOutputStream();
byte[] parcel = new byte[4096];
while (serializableInputStream.read(parcel) > 0)
outputStream.write(parcel);
outputStream.flush();
serializableInputStream.close();
outputStream.close();
//...
}
JavaDocsSerializableInputStream
で説明されています。これにより、InputStream をシリアル化して、たとえばリモート処理で渡すことができます。
一度にすべてのバイトではなく、入力から読み取って出力に書き込みます。残念ながら、ポートレットはコンテンツを「ストリーミング」していません。ファイル (画像など) は、入力ストリーム全体を読み取った後にのみブラウザに送信されます。ファイルがデータベースから (ライブ ログから) 読み取られているのがわかりますが、画面に「成長中」の画像が表示されません。
私は何を間違っていますか?Liferay 6.0.6 と Spring Portlet MVC でファイルを実際にストリーミングすることは可能ですか?