ファイルのアップロード制限を設定するSpringサーブレットイニシャライザ。ファイルごとに5MB、要求ごとに10MB。

MyWebInitializer.java

public class MyWebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    private int maxUploadSizeInMb = 5 **  1024 **  1024;//5 MB

   //...

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {

       //upload temp file will put here
        File uploadDirectory = new File(System.getProperty("java.io.tmpdir"));

       //register a MultipartConfigElement
        MultipartConfigElement multipartConfigElement =
                new MultipartConfigElement(uploadDirectory.getAbsolutePath(),
                        maxUploadSizeInMb, maxUploadSizeInMb **  2, maxUploadSizeInMb/2);

        registration.setMultipartConfig(multipartConfigElement);

    }

}

アップロード制限よりも大きいファイルサイズをアップロードしようとすると、20MBと言うと、次のような奇妙な「接続のリセット」エラーが表示されます。


spring-file-upload-connection-reset

グローバルな@ControllerAdviceでさえ、上記の例外を捕まえることはできません!

テスト済み

  1. Spring 4.3.5.RELEASE

  2. Tomcat 8

  3. link://spring-mvc/spring-mvc-file-upload-example/[Spring MVCファイル

アップロードの例]

1.解決策

数日の調査と調査の後、問題はSpringに関連していないことがわかります(Jettyに配備されていれば問題ありません)。これはTomcatのデフォルトコネクタ `maxSwallowSize`です

The maximum number of request body bytes (excluding transfer encoding
overhead) that will be swallowed by Tomcat for an aborted upload. An
aborted upload is when Tomcat knows that the request body is going to be
ignored, but the client still sends it. If Tomcat does not swallow the
body the client is unlikely to see the response. If not specified the
default of 2097152 (2 megabytes) will be used. A value of less than zero
indicates that no limit should be enforced.

サイズ制限を超えたファイルサイズをアップロードしようとすると、Tomcatはそれをデフォルトの2MBで切り取り、接続をリセットします。それを素早く解決するには、 `maxSwallowSize`に-1(無限)を入れてください。

Tomcat/conf/server.xml

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxSwallowSize="-1"/>

この-1は開発には適していますが、運用には適していません。ユーザーが100MBのファイルをアップロードしようとすると、余分な帯域幅を処理するためにリソースが浪費されます。

2.アイデア

{空} 2。 1この例では、ファイルのアップロードに妥当な制限を設けてください。たとえば、「11mb」(11 x 1024 x 1024 = bytes)

Tomcat/conf/server.xml

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxSwallowSize="11534336"/>

2.2アップロードする前にファイルサイズを確認するためのJavaScriptを実装します。

Jetty 9でテストしたところ、 `maxSwallowSize`設定が見つからず、ファイルサイズがアップロード制限を超過しても接続はリセットされません。

参考文献

春のブートアプリケーションのプロパティを使用してtomcatのプロパティ]。 link://spring-mvc/spring-mvc-file-upload-example/[Spring MVCファイル

アップロードの例]


接続リセット


file upload

リンク://tag/spring-mvc/[spring mvc]

tomcat