当前位置: 首页 > 知识库问答 >
问题:

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

杨良平
2023-03-14

因此,我是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.

这是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上下文中的多部分解析器配置。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>

依赖项:

<!-- 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的配置文件上下文。xml到META-INF/context。xml和编辑过的上下文标记如下:

<Context allowCasualMultipartParsing="true">

似乎没有什么工作,任何帮助将不胜感激。

共有3个答案

司徒泰
2023-03-14

对于那些对PUT方法处理程序获得相同异常的人:请改用POST<代码>放置与多部件不兼容。

有关更多详细信息,请参见相应的答案

罗建弼
2023-03-14

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

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

那么,顺从的方式是什么?阅读官方的JEE 6教程给出了一个提示。如果要对Servlet 3或更新版本使用符合规范的方式,则Servlet必须具有MultipartConfig。根据配置servlet的方式,您有三种选择:

>

  • 使用编程配置:<代码>上下文。addServlet(名称,servlet)。setMultipartConfig(新的MultipartConfigElement(“您的路径”)
  • 通过注释,使用javax对servlet的类进行注释。servlet。注释。MultipartConfig
  • 使用XML配置,将其添加到WEB-INF/WEB。xml描述符,在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>
    

  • 万选
    2023-03-14

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

    聚甲醛

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

    Spring上下文

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

    Spring控制器

    @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:/";
            }
        }
    
     类似资料:
    • 我想使用火花从html表单上传文件。以下是我的java函数来处理帖子路由: 以下是超文本标记语言形式: 当我上传文件时,我收到500:内部服务器错误,具有以下堆栈跟踪: 遵循以下问题,但答案不起作用:SparkJava:上传文件在Spark java框架中不起作用 我正在使用eclipse IDE和tomcat服务器。 请帮我解决这个问题。

    • 我写了一个简单的控制器来上传文件: 注释是: 我的ContextCOnfiguration类是: 已更新 文件: -已更新- 当执行post请求(使用postman)时,我得到: 我已经在stackoverflow上查看了一些类似的问题,但没有一个答案对我有帮助。 Spring版本为:4.0.4 任何帮助将不胜感激(当然要竖起大拇指)。 谢谢

    • 我有一个工作的Spring-boot mvc应用程序,我正在尝试集成文件上传选项。根据手册,我配置了以下模板: /src/main/resource/templates/file upload . html 当我登录,然后调用http:/ 127.0.0.5:8080 /上传表单显示时,但当我点击提交按钮时,我得到了。错误消息 HTTP状态403-在请求参数“_csrf”或标头“X-CSRF-TO

    • 我注意到这里的多部分请求有一个奇怪的问题。 下面是Spring Boot 2.4.2中使用的球衣2实现: 并遵循 Spring Boot 依赖项: 我能够使用Postman成功上传JSON和文件(作为多部分/表单数据),但是来自Java客户端的相同请求抛出以下错误: 这篇关于SO的文章说我们需要添加一个< code > CommonsMultipartResolver ,但是为什么它在Postma

    • 问题内容: 我正在使用Heroku部署NodeJs应用程序。除了提供静态文件的一个小问题外,其他所有东西都工作正常。 我有以下配置 除非我尝试提供子文件夹中的静态文件,否​​则它工作正常。 www.example.com/bar.js //这会提供文件/htdocs/bar.js www.example.com/foo/bar.js //无法找到文件/htdocs/foo/bar.js 我忘了说在

    • Im使用Spring Boot,并希望使用控制器接收多部分文件上传。当发送文件时,我一直得到错误415不支持的内容类型响应,并且控制器从未到达 我尝试在HTML/JSP页面和使用RESTTemplate的独立客户端应用程序中使用Form:Action发送。所有尝试的结果都是一样的 从multipart文档看来,边界参数必须添加到multipart上载,但这似乎与控制器接收不匹配 我的控制器方法设置