簡體   English   中英

無法使用ServletFileUpload上傳100MB文件

[英]Unable to upload 100MB file using ServletFileUpload

我必須上傳100MB文件。 我的前端部分是Angular 4,后端部分是Java和Spring 4。 我將其公開為REST端點。 一旦我在一段時間后上傳文件,連接就會中斷,並且不會返回任何內容到前端。

@SuppressWarnings("unchecked")
    @RequestMapping(value = "/insertDoc.action", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Map<String, Object>> insertDoc(final HttpServletRequest request,
            final HttpServletResponse response, @RequestParam(name = "docType", required = false) final String docType) {
        List<DocumentMetadataVO> docIdList = new ArrayList<DocumentMetadataVO>();
        try {

            boolean isMultipart = ServletFileUpload.isMultipartContent(new ServletRequestContext(request));

            if (isMultipart) {
                DiskFileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setFileSizeMax(MAX_FILE_SIZE);
                upload.setSizeMax(MAX_REQUEST_SIZE);

                List<FileItem> items = upload.parseRequest(request);
                for (FileItem fileItem : items) {
                    DocumentMetadataVO documentMetadataVO = new DocumentMetadataVO();
                    documentMetadataVO.setFileData(fileItem.get());
                    documentMetadataVO.setDocumentName(fileItem.getName());
                    documentMetadataVO.setUploadDate(new Date());
                    logger.info("File Name is::" + documentMetadataVO.getDocumentName());
                    documentMetadataVO.setDocType(docType);
                    String docId = commonService.insertDocument(request, documentMetadataVO);
                    documentMetadataVO.setDocId(docId);
                    docIdList.add(documentMetadataVO);
                }
            }

        } catch (Exception e) {

            logger.error(e);
            return new ResponseEntity<Map<String, Object>>(getModelMapError(e.getMessage()),
                    HttpStatus.INTERNAL_SERVER_ERROR);
        }

        return new ResponseEntity<Map<String, Object>>(getMap(docIdList), HttpStatus.OK);
    }

在Spring App中沒有堆棧跟蹤的大文件上傳失敗表明Tomcat配置錯誤。

如果文件太大,Tomcat會自動斷開連接(即使您設置了spring.http.multipart.max-file-sizespring.http.multipart.max-request-size屬性)。

因此,要解決此問題,您應該配置tomcat以允許上傳大文件

打開$TOMCAT_HOME/webapps/manager/WEB-INF/web.xml並編輯以下屬性:

<!-- 150MB max -->
<multipart-config>
   <max-file-size>157286400</max-file-size>
   <max-request-size>209715200</max-request-size>
   <file-size-threshold>0</file-size-threshold>
</multipart-config>

也可以在應用程序xml文件中指定多部分解析器的大小。 您既可以通過它也可以通過編程來實現

應用程式xml

要將其添加到您的xml文件中,您可以像下面這樣添加一個bean:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="16777215" />
</bean>

編程方式

要以編程方式添加並可能可配置,請嘗試以下操作:

/**
 * Configuration to set the multipart Resolver bean and the max upload size
 *
 */
@Configuration
@Component
public class MultipartResolverBeanConfig {


  /**
   * Create the multipart resolver bean
   * Set the maximum upload file size 
   * @return
   */
  @Bean(name="multipartResolver")
  public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(157286400L);
    return multipartResolver;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM