web-dev-qa-db-ja.com

Zuul経由で大きなファイルをアップロードする

Zuulを介して大きなファイルをアップロードする際に問題が発生しました。私はApache-commonsファイルのアップロード( https://commons.Apache.org/proper/commons-fileupload/ )を使用して大きなファイルをストリーミングし、前面にzuulを使用しています。私のSpringBootアプリケーションでは、Apachecommonsからのものを使用するためにSpringが提供するアップロードを無効にしました。

  spring:
      http:
          multipart:
              enabled: false

コントローラは次のようになります。

public ResponseEntity insertFile(@PathVariable Long profileId, 
    HttpServletRequest request) throws Exception {
    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator uploadItemIterator = upload.getItemIterator(request);
    if (!uploadItemIterator.hasNext()) {
        throw new FileUploadException("FileItemIterator was empty"); 
    } 
    while (uploadItemIterator.hasNext()) {
        FileItemStream fileItemStream = uploadItemIterator.next();
        if (fileItemStream.isFormField()) {
            continue; 
        } 
       //do stuff 
    } 
    return new ResponseEntity(HttpStatus.OK);
} 

アプリケーションに直接(zuulなしで)アクセスすると、ファイルのアップロードは意図したとおりに機能します。ただし、zuulを介してアクセスした場合、FileItemIteratorにはトラバースするアイテムがなく、要求はすぐにエラーで終了します(ERR_CONNECTION_RESET)。 zuulについては、Springによって提供されたマルチパートも無効にしました。それ以外の場合は機能します。ただし、ファイルはストリーミングされません。それらは完全にロードされ、コントローラーの内部に入った後にのみロードされます(通常のSpringの動作)。 zuulでApache-commonsストリーミングオプションを使用する方法はありますか?

7
dvelopp

私は解決策を見つけました。それは基本的にここで説明されています:

http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_uploading_files_through_zuul

それを機能させるために私がしたこと。ステップバイステップ:

  1. Spring DispatcherServletをバイパスするために、URLを変更しました。

差出人: http:// localhost:8081/MyService/file

宛先: http:// localhost:8081/zuul/MyService/file

  1. Springマルチパートアップロードの無効化を維持:

    spring:
        http:
            multipart:
                enabled: false
    

次のヘッダーは必要ありません。転送エンコーディング:チャンク

それなしで大きなファイルをアップロードしようとしましたが、問題ありませんでした。

9
dvelopp