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ストリーミングオプションを使用する方法はありますか?
私は解決策を見つけました。それは基本的にここで説明されています:
http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_uploading_files_through_zuul
それを機能させるために私がしたこと。ステップバイステップ:
差出人: http:// localhost:8081/MyService/file
宛先: http:// localhost:8081/zuul/MyService/file
Springマルチパートアップロードの無効化を維持:
spring:
http:
multipart:
enabled: false
次のヘッダーは必要ありません。転送エンコーディング:チャンク
それなしで大きなファイルをアップロードしようとしましたが、問題ありませんでした。