【问题标题】:Issue with Tomcat and parsing MultipartFile Upload serviceTomcat 和解析 MultipartFile Upload 服务的问题
【发布时间】:2021-03-17 14:50:22
【问题描述】:

我有一个带有端点的应用程序和一个运行它的 tomcat 服务器。我可以用文件点击邮递员的端点并将其上传到我服务器上的 excel 文件中。

问题是为了让它工作我必须在我的 tomcat 的 context.xml 中添加 allowCasualMultipartParsing="true" 我不想在我的本地 tomcat 上添加这个修复程序。

我需要一个修复程序,尽管它正在运行的 tomcat 服务器也能正常工作。因此,如果有人要添加一个新的 tomcat,他们就不会遇到这个问题。例如在 tomcat 9.0.6

很难证明这个问题,因为它是由于在独立的 tomcat 上运行应用程序造成的。当我在没有独立的 tomcat 9.0.38 的情况下运行它时它可以工作。

上传文件代码

@Controller
@RequestMapping("/ListCtrl")
public class listController {
    
    @RequestMapping(method = {RequestMethod.POST}, value = "/list")
    @Consumes (MediaType.MULTIPART_FORM_DATA)
    @Produces (MediaType.TEXT_XML)
    @ResponseBody public Map<String, Object> uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") MultipartFile file,
        @RequestParam("listName") String listName,
        @RequestParam Integer
        listid){
        Map<String, Object> resultMap =  null;
        resultMap = new HashMap<>();
        resultMap.put("status", "successful");
        resultMap.put("file", file.getName());
        System.out.println(file.getOriginalFilename());
    return resultMap;
    }   

我在无法运行的项目上遇到的错误是 HTTP 状态 500 - 无法解析多部分 servlet 请求;嵌套异常是java。 lang.IllegalStateException: 无法处理部分,因为没有提供多部分配置

【问题讨论】:

    标签: java spring spring-boot multipartform-data tomcat9


    【解决方案1】:

    我找到了解决方案。我以前看过但没有完全理解,所以我想在这里详细说明一下,以防其他人看到它。尽管 Tomcat 正在运行,但该解决方案仍然有效。 您需要创建一个 META-INF 文件夹。对我来说,我在已部署的资源文件夹下创建并添加了 context.xml。在我将 allowCasualMultipartParsing="true" 放在上下文标签中之后。 Webapp/已部署资源/META-INF/context.xml。

    Spark Java: Unable to process parts as no multi-part configuration has been provided

    【讨论】:

      【解决方案2】:

      只要你提供一个配置就足够了。正如 Spring 文档中所提到的,Spring 中包含两个具体的实现。

      1. CommonsMultipartResolver 用于 Apache Commons FileUpload 和
      2. StandardServletMultipartResolver 用于 Servlet 3.0+ 部分 API

      为了更好的灵活性和可配置性,我选择使用 CommonsMultipartResolver。在优点中,它提供了 maxUploadSizemaxInMemorySizedefaultEncoding 设置作为 bean 属性。但是,您必须将其导入为:

      <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.3</version>
      </dependency>
      

      在你的代码中:

      @Configuration
      public class WebConfig {
          private int maxUploadSizeInMb = 2 * 1024 * 1024; // 2 MB
          ...
          ...
          @Bean("multipartResolver")
          public CommonsMultipartResolver multipartResolver() {
              CommonsMultipartResolver cmr = new CommonsMultipartResolver();
              cmr.setMaxUploadSize(maxUploadSizeInMb * 2); //sum size of all files/parts of a file. Since, a file may be partitioned
              cmr.setMaxUploadSizePerFile(maxUploadSizeInMb);//maximum file size of each file
              return cmr;
      
          }
      }
      

      【讨论】:

      • 尝试此操作时出现此错误。我也没有得到这个顺便说一句,您是否使用此代码配置了我通过输入传递的 MultipartFile 对象? fcm.fpw.web.controller.HotListsCtrl:通过工厂方法进行 Bean 实例化失败;嵌套异常。无法实例化工厂方法“multipartResolver”引发异常;嵌套异常是 java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
      • 抱歉,答案不够详细。我已经更新了它,以便更好地为您提供这个想法。虽然我没有覆盖StandardServletMultipartResolver
      • 此问题/答案与 Apache Commons FileUpload 无关。这是关于 Servlet 3.0 内置的 multipart/form-data 解析
      • 就像我说的,你可以选择一个,因为它们是 Spring 3.1 中包含的 2 个具体实现。 docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
      猜你喜欢
      • 2019-03-22
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多