Spring MVC文件上载-无法处理部件,因为未提供多部件配置

Spring MVC文件上载-无法处理部件,因为未提供多部件配置,spring,spring-mvc,tomcat,file-upload,illegalstateexception,Spring,Spring Mvc,Tomcat,File Upload,Illegalstateexception,因此,我是Spring的新手,我试图让文件上传为我的项目工作(顺便说一句,我使用的是Spring工具套件),提交表单时,我得到的只是: HTTP状态500-无法解析多部分servlet请求;嵌套异常为java.lang.IllegalStateException:无法处理部件,因为未提供多部件配置 来自浏览器的堆栈跟踪: type Exception report message Could not parse multipart servlet request; nested excepti

因此,我是Spring的新手,我试图让文件上传为我的项目工作(顺便说一句,我使用的是Spring工具套件),提交表单时,我得到的只是:

HTTP状态500-无法解析多部分servlet请求;嵌套异常为java.lang.IllegalStateException:无法处理部件,因为未提供多部件配置

来自浏览器的堆栈跟踪:

type Exception report message Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided description The server encountered an internal error that prevented it from fulfilling this request. exception org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:100) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:78) org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:75) org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) root cause java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided org.apache.catalina.connector.Request.parseParts(Request.java:2676) org.apache.catalina.connector.Request.getParts(Request.java:2643) org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1083) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:85) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:78) org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:75) org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) note The full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs. 控制器映射方法:

@RequestMapping(value = "/newArtist", method = RequestMethod.GET)
public String showAddArtistForm(Model model)
{
    model.addAttribute("artist", new Artist());
    return "newArtist";
}

@RequestMapping(value = "/newArtist", method = RequestMethod.POST)
public String addArtist(@ModelAttribute("artist") @Valid Artist artist, BindingResult result,
        @RequestParam("photo") MultipartFile photo) throws IOException
{   
    if (result.hasErrors())
        return "newArtist";

    if(photo.getBytes() != null)
        artist.setPhoto(photo.getBytes());

    artistService.addArtist(artist);

    return "redirect:artists.html";
}
servlet-context.xml中的多部分解析器配置:

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

web.xml中的筛选器:

<filter>
    <filter-name>MultipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>MultipartFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

多部件滤波器
org.springframework.web.multipart.support.MultipartFilter
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
多部件滤波器
/*
springSecurityFilterChain
/*
依赖项:

<!-- Apache Commons FileUpload -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>

    <!-- Apache Commons IO -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

文件上传
文件上传
1.3.1
公地io
公地io
2.4
我还将Tomcat的配置文件context.xml导入META-INF/context.xml,并编辑了如下上下文标记:

<Context allowCasualMultipartParsing="true">


似乎什么都不起作用,任何帮助都将不胜感激。

我有一些类似的东西,但我所做的只是发送一个文件,而没有将其与我的模型中的任何属性进行映射,在您的情况下,我将修改以下内容:

<div class="form-group">
    <div class="col-lg-3">
        <label for="photo">Artist photo:</label>
        <input type="file" id="photo" name="file"/>
    </div>
</div>

实际上,您不需要web.xml上的任何过滤器就可以使用SpringMVC上传您的多部分文件。我在我的项目中使用了相同的配置,并且可以正常工作(${spring.version}=4.3.4.RELEASE):

聚甲醛


如果您使用的是Tomcat8
在Tomcat的conf/context.xml中配置以下内容

  • 将AllowCasalMultipartParsing=“true”属性添加到上下文节点
  • 添加内部上下文节点

    • 没有一个答案正确地解决了这个问题。根据,在配置
      AllowCasalMultipartParsing
      时:

      如果调用HttpServletRequest.getPart*或HttpServletRequest.getParameter*时Tomcat应自动解析多部分/表单数据请求正文,则设置为true,即使目标servlet未标记@MultipartConfig注释(有关详细信息,请参阅servlet规范3.0第3.2节)请注意,除false之外的任何设置都会导致Tomcat的行为在技术上不符合规范。默认值为false

      那么,顺从的方式是什么?读懂这位官员给出了一个暗示。如果希望对Servlet 3或更新版本使用符合规范的方式,则Servlet必须具有
      MultipartConfig
      。根据配置servlet的方式,您有三种选择:

      <multipart-config>
           <location>/tmp</location>
           <max-file-size>20848820</max-file-size>
           <max-request-size>418018841</max-request-size>
           <file-size-threshold>1048576</file-size-threshold>
      </multipart-config>
      
      • 使用编程配置:
        context.addServlet(名称,servlet).setMultipartConfig(新的MultipartConfigElement(“您的路径”)
      • 使用注释,使用
        @javax.servlet.annotation.MultipartConfig
        注释servlet的类
      • 使用XML配置,将其添加到servlet部分的
        WEB-INF/WEB.XML
        描述符中:

        <multipart-config>
             <location>/tmp</location>
             <max-file-size>20848820</max-file-size>
             <max-request-size>418018841</max-request-size>
             <file-size-threshold>1048576</file-size-threshold>
        </multipart-config>
        
        
        /tmp
        20848820
        418018841
        1048576
        

      没有找到多部件配置,这是一个简单的例外。尽管您提供了多部件解析器bean

      问题是,在Spring安全筛选器之前指定MultipartFilter时,它试图获取multipartResolverbean,但找不到它。因为它希望bean名称/id为filterMultipartResolver而不是multipartResolver

      帮你自己一个忙。请更改bean配置,如下所示-

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

      在Spring引导应用程序中存在相同的问题,此异常会发生多次:

      • org.springframework.web.multipart.MultipartException:无法分析多部分servlet请求;嵌套异常为
      • java.lang.IllegalStateException:org.apache.tomcat.util.http.fileupload.FileUploadBase$filesizelimiteExceedeException:字段multipartFile超过了其最大允许大小1048576字节
      org.apache.tomcat.util.http.fileupload.FileUploadBase$filesizelimitexceedException:字段multipartFile超过了其最大允许大小1048576字节

      用这个来摆脱tomcat异常,从

      Tomcat大文件上传连接重置。需要让{@link#containerCustomizer()}正常工作,其他明智的异常将发生多次,上传错误的RequestMapping将失败

      @Bean
      public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
      
          TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
      
          tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
              if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                  //-1 means unlimited
                  ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
              }
          });
      
          return tomcat;
      
      }
      
      @Bean
      公共TomcatEmbeddedServletContainerFactory tomcatEmbedded(){
      TomcatEmbeddedServletContainerFactory tomcat=新的TomcatEmbeddedServletContainerFactory();
      tomcat.addConnectorCustomizer((TomcatConnectorCustomizer)连接器->{
      if((connector.getProtocolHandler()instanceof AbstractHttp11Protocol)){
      //-1表示无限制
      ((AbstractHttp11Protocol)connector.getProtocolHandler()).setMaxThanksize(-1);
      }
      });
      返回tomcat;
      }
      
      将配置文件添加为:

      @Bean(name = "multipartResolver")
      public CommonsMultipartResolver CanBeAnyName() { 
      //configuration
      
      }
      

      对于那些对
      PUT
      方法处理程序获得相同异常的人:请改用
      POST
      PUT
      与多部分不兼容


      更详细的信息可以在

      中找到,不幸的是,它不起作用,仍然会发生相同的错误。@kbijoch为了测试的目的,请从控制器中删除有效的。您的所有配置看起来都是正确的,我也有相同的配置,仍然没有成功,但感谢您的帮助。文件名重要吗?我不认为重要,但您可以尝试使用一个small小于1mb,名为test.log或类似的东西。很奇怪,我有相同的代码,让我检查一下,againI尝试了一些具有不同扩展名的文件,仍然存在相同的问题。可能与环境有关吗?在回答时,我回答了,我的问题已解决。作为参考,我使用它作为别名:
      谢谢
          <form method="POST" enctype="multipart/form-data" action="uploadAction">
              <table>
                  <tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>
                  <tr><td></td><td><input type="submit" value="Upload" /></td></tr>
              </table>
          </form>
      
      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <property name="maxUploadSize" value="10000000"/>
      </bean>
      
      @PostMapping("/uploadAction")
          public String handleFileUpload(@RequestParam("file") MultipartFile file,
                  RedirectAttributes redirectAttributes) {
      
              File out = new File("outputfile.pdf");
              FileOutputStream fos = null;
      
              try {
                  fos = new FileOutputStream(out);
      
                  // Writes bytes from the specified byte array to this file output stream 
                  fos.write(file.getBytes());
                  System.out.println("Upload and writing output file ok");
              } catch (FileNotFoundException e) {
                  System.out.println("File not found" + e);
              } catch (IOException ioe) {
                  System.out.println("Exception while writing file " + ioe);
              } finally {
                  // close the streams using close method
                  try {
                      if (fos != null) {
                          fos.close();
                      }
                  } catch (IOException ioe) {
                      System.out.println("Error while closing stream: " + ioe);
                  }
      
                  //storageService.store(file);
                  redirectAttributes.addFlashAttribute("message",
                          "You successfully uploaded " + file.getOriginalFilename() + "!");
      
                  return "redirect:/";
              }
          }
      
      <multipart-config>
           <location>/tmp</location>
           <max-file-size>20848820</max-file-size>
           <max-request-size>418018841</max-request-size>
           <file-size-threshold>1048576</file-size-threshold>
      </multipart-config>
      
      <bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <property name="maxUploadSize" value="10000000"/>
      </bean>
      
      @Bean
      public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
      
          TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
      
          tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
              if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                  //-1 means unlimited
                  ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
              }
          });
      
          return tomcat;
      
      }
      
      @Bean(name = "multipartResolver")
      public CommonsMultipartResolver CanBeAnyName() { 
      //configuration
      
      }