Spring MVC文件上传 - 由于没有提供多个部分配置,因此无法处理零件



所以我是春季的新手,我正在尝试为我的项目上传文件(我正在使用Spring Tool Suite suite suite btw。),在提交表单时,'M Get是:

HTTP状态500-无法解析多部分servlet请求;嵌套异常是Java.lang.IlgalStateException:由于没有提供多个部分配置,因此无法处理零件

浏览器的堆栈跟踪:

类型异常报告消息无法解析多部分servlet请求;嵌套异常是Java.lang.IlgalStateException:由于未提供多部分配置,因此无法处理零件说明服务器遇到了一个内部错误,该错误阻止了其满足此请求。例外org.springframework.web.multipart.multipartexception:无法解析Multipart Servlet请求;嵌套异常是Java.lang.IlgalStateException:由于未提供多部分配置,因此无法处理零件    org.springframework.web.multipart.support.standardmultiparthtppservletrequest.parserequest(standardmultiparthttpservletrequest.java:100)    org.springframework.web.multipart.support.standardmultiparthttpservletrequest。    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(一次perrequestfilter.java:106)根本原因java.lang.illegalstateException:由于未提供多部分配置,因此无法处理零件    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。    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(一次perrequestfilter.java:106)请注意,根本原因的完整堆栈跟踪可在Apache Tomcat/8.0.27日志中使用。

这是JSP中的形式标签:

<form:form class="form-horizontal" role="form" method="post"
            action="newArtist.html" modelAttribute="artist" enctype="multipart/form-data">

输入零件:

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

照片存储在艺术家对象中:

@Lob
private byte[] photo;

控制器映射方法:

@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中的Multipart Resolver配置:

<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>

依赖项:

<!-- 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>

我还将tomcat的config file context.xml导入到meta-inf/context.xml和编辑上的上下文标签,如:

<Context allowCasualMultipartParsing="true">

似乎没有任何帮助,任何帮助将不胜感激。

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

pom

     <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- Apache Commons FileUpload -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.2</version>
    </dependency>
    <!-- Apache Commons IO -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>

html

    <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:/";
        }
    }

没有一个答案正确解决问题。根据tomcat文档,关于allowCasualMultipartParsing的配置:

如果httpservletrequest.getPart*或httpservletrequest.getParameter*被称为TOMCAT,即使目标servlet未用@muttipartConfig notigation 3.0参见Servlet Specification 3.0,即使httpservletRequest*或httpservletrequest.getParameter*也被称为True tome Multipart/form-data请求物体。,第3.2节以获取详细信息)。请注意,除了错误以外的任何设置都会导致tomcat以不合时宜的方式行为。默认值为false。

那么,遵守方式是什么?阅读官方JEE 6教程提示。如果您想使用Servlet 3或更新的符合规范的方式,则您的servlet必须具有MultipartConfig。您有三个选择,具体取决于您的配置方式:

  • 使用程序化配置:context.addServlet(name, servlet).setMultipartConfig(new MultipartConfigElement("your_path")
  • 带有注释,用@javax.servlet.annotation.MultipartConfig进行注释。
  • 使用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>
    

对于那些获得PUT方法处理程序相同例外的人:而是使用POSTPUT与多部分不兼容。

更多详细信息可以在相应的答案中找到

从没有找到多部分配置的例外,这是直接的。尽管您已经提供了 Multipartresolver bean。

问题在于,在弹簧安全过滤器之前指定多Artfilter时,它试图获得 Multinatresolver bean,但找不到它。因为它期望bean名称/id为 filtermeltipartresolver ,而不是 suptilepartresolver

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

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

在您的配置文件中添加为:

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

我有类似的东西,但是我所做的只是在我的模型中使用任何属性映射的文件,在您的情况下,我会修改此信息:

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

在您的控制器中

@RequestMapping(value = "/newArtist", method = RequestMethod.POST)
public String addArtist(@ModelAttribute("artist") @Valid Artist artist, BindingResult result,
    @RequestParam("file") MultipartFile file) throws IOException
//Here read the file and store the bytes into your photo attribute
...

在Spring Boot应用程序中遇到相同的问题,此例外发生了几次:

  • org.springframework.web.multipart.multipartexception:无法解析Multipart Servlet请求;嵌套异常是

org.apache.tomcat.util.http.fileupload.fileuploadbase $ filesizelimitexceededException:field multipartfile超过其最大允许的大小1048576字节。

摆脱了这种例外,并从http://www.mkyong.com/spring-boot/spring-boot-boot-file-upload-example/

tomcat大文件上传连接重置。需要让{@link #containercustomizer()}正常工作,其他明智的例外将发生多次,uploadError的请求映射将失败。

@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;
}

如果有人使用J2EE而不是弹簧框架并且仍面临问题

您可以尝试的是在servlet上添加@MultipartConfig注释,然后在表单中添加enctype="multipart/form-data"

如果您使用的是tomcat8。

在tomcat的conf/context.xml

中配置以下内容
  • 添加AllowCasualMultiPartParsing =" True"属性到上下文节点
  • add&lt;资源cachingallowed =" true" cachemaxsize =" 100000"/&gt;内部上下文节点

最新更新