私はSpringブートアプリケーションで作業しています。大きなファイルをダウンロードする際に問題があります。つまり、クライアントページでダウンロードリンクをクリックすると、ブラウザのダウンロードダイアログが表示されるまでに時間がかかります。小さなファイルの場合は即座に表示されますが、大きなファイルの場合は最大30秒かかります。大きなファイルをブロックせずにダウンロードする
これは、ファイルの内容がクライアントに送信される前にレスポンス出力ストリームに完全に書き込まれるまで、コントローラがブロックすると考えられます。私は様々なオプションを試して即座に応答を送ったが、まだ結果がない。これは私が今までに持っているものです:
@RequestMapping(method = RequestMethod.GET, value = "/content/file/download")
public ResponseEntity<InputStreamResource> downloadFile(@RequestParam(name = "path") String path, HttpServletRequest request)
throws IOException, NotFoundException, BadRequestException, InternalServerErrorException{
getApplicationId(request);
String orgId = getOrganizationId(request);
LOGGER.debug("Downloading for path {}", path);
try{
Session session = getCurrentSession(request);
FileStorageService service = new JCRFileStorageService(session);
ProtonItem item = service.getItem(path, orgId);
InputStream is = service.getFileDownloadStream(path, orgId);
InputStreamResource resource = new InputStreamResource(is);
HttpHeaders headers = new HttpHeaders();
headers.setContentLength(item.getMetadata().getMetadata(ProtonBaseConstants.META_FILE_SIZE, Long.class));
headers.set(HttpHeaders.CONTENT_TYPE, item.getMetadata().getMetadata(ProtonBaseConstants.META_MIME_TYPE, String.class));
headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + item.getName());
return ResponseEntity.ok().headers(headers).body(resource);
} catch(ProtonRepoException ex){
throw ProtonExceptionMapper.processException(ex);
}
}
これは、すぐにダウンロードを開始するのに十分でなければならないが、それは動作しません。私はIOUtils.copy()
を使ってみましたが、入力ストリームから出力ストリームに直接コピーしましたが、何も動作していないようです。
紛失しているものがありますか?たぶん、いくつかのSpringブート設定、または何か?
そして、 'service.getFileDownloadStream'は何をしていますか?メモリ内の何かを' byte [] 'として読み込んでいますか?推測の代わりに、アプリケーションにメトリックを追加して、何が時間がかかっているかを把握したい場合があります。 –
いいえ、このメソッドは 'InputStream'を基本ファイルに返します。私はこれをチェックしたが、それは問題ではない、完了するのにわずか数ミリ秒かかる。 – vdjurovic
大きなファイルはどのように作成しますか?たとえば、SQL結果セットをオブジェクトにマッピングしてからファイルにマッピングします。この場合は、結果セットからのマッピングおよびストリームを直接スキップします。 – Ibrahim