2016-11-28 7 views
0

私は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ブート設定、または何か?

+1

そして、 'service.getFileDownloadStream'は何をしていますか?メモリ内の何かを' byte [] 'として読み込んでいますか?推測の代わりに、アプリケーションにメトリックを追加して、何が時間がかかっているかを把握したい場合があります。 –

+0

いいえ、このメソッドは 'InputStream'を基本ファイルに返します。私はこれをチェックしたが、それは問題ではない、完了するのにわずか数ミリ秒かかる。 – vdjurovic

+0

大きなファイルはどのように作成しますか?たとえば、SQL結果セットをオブジェクトにマッピングしてからファイルにマッピングします。この場合は、結果セットからのマッピングおよびストリームを直接スキップします。 – Ibrahim

答えて

-1

自分の質問に答えるために...それはその問題は全くサーバ側ではなかったのではなく、クライアント上で判明。私は2つの異なるクライアントでテストし、ダウンロードは期待通りに動作します。即座に始まります。

元の問題は、使用しているAngularクライアントから来ており、サーバー側とは関係ありません。

皆さんの時間を無駄にして申し訳ありません。助けようとしてくれてありがとう、みんな。

+0

私はこの答えを理解していません。テストしたこれらのクライアントは何ですか?これは答えよりもコメントのようです。 –

+0

フロントエンドとして角度アプリを使用しています。サーバーにGETリクエストを使用してファイルをダウンロードしています。問題は、ブラウザのGETと同じではありません。ブラウザのダウンロードウィンドウは、ファイルが完全にダウンロードされるまで表示されません。 – vdjurovic

関連する問題