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

Spring-Boot Tomcat 8.0.3 FileUpload错误无法处理部件,因为没有提供多部件配置

夹谷斌蔚
2023-03-14

我有一个工作的Spring-boot mvc应用程序,我正在尝试集成文件上传选项。根据手册,我配置了以下模板:

/src/main/resource/templates/file upload . html

<!DOCTYPE html>
<html layout:decorator="layout">

<head> 
<title>syncServer File upload example</title>
</head>
  <body>
    <div layout:fragment="content">

    <div >
        <form th:action="@{/upload}" enctype="multipart/form-data" th:method="post">
            <fieldset>
                     <legend>File to upload:</legend>
                     <input type="file" name="myFile" />
                     <label>Name :</label>
                     <input type="text" name="myName"/>
                     <input type="submit" />
            </fieldset>
    </form>
    </div>

    </div>

  </body>
</html>

当我登录,然后调用http:/ 127.0.0.5:8080 /上传表单显示时,但当我点击提交按钮时,我得到了。错误消息

HTTP状态403-在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的CSRF令牌“null”。

我去禁用了csrf,以查看如果禁用跨站点请求伪造(“.csrf().disable()”),表单是否只会工作。即

   @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
//          .headers().disable()
            .authorizeRequests()
                .antMatchers("/resources/css/**","/register", "/resources/img/**" , "/resources/js/**", "/resources/pdf/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

当我尝试在csrf期间上载另一个文件时,我遇到了另一个错误,即:

HTTP状态500 -请求处理失败;嵌套异常为org . spring framework . web . multipart . multipart异常:无法解析多部分servlet请求;嵌套异常为Java . lang . illegalstateexception:无法处理部件,因为没有提供多部件配置

它说“没有提供多部分配置”,但我有一个配置文件来配置multipartConfigElement,即。

@Configuration
public class FileUpload {
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultiPartConfigFactory factory = new MultiPartConfigFactory();
        factory.setMaxFileSize("600KB");
        factory.setMaxRequestSize("600KB");
        return factory.createMultipartConfig();
    }
}

我的应用程序类上面还有@ComponentScan注释和@ enable auto配置,即:

@ComponentScan(basePackages = "org.syncServer.*")
@Configuration
@EnableWebSocketMessageBroker
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {
...
}

当应用程序启动时,我正在列出由spring管理的所有bean,并且我确实看到bean“multipartResolver”正在启动。

与文件关联的控制器上传.html:

@Controller
public class FileUploadController {


    @RequestMapping(value="/upload", method=RequestMethod.GET)
    public String provideUploadInfo() {
        return "fileUpload";
    }


    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public @ResponseBody String handleFileUpload(@RequestParam("myName") String myName, 
            @RequestParam("myFile") MultipartFile myFile){
        if (!myFile.isEmpty()) {
            try {
                byte[] bytes = myFile.getBytes();
                BufferedOutputStream stream = 
                        new BufferedOutputStream(new FileOutputStream(new File(myName + "-uploaded")));
                stream.write(bytes);
                stream.close();
                return "Successfully uploaded " + myName + " into " + myName + "-uploaded !";
            } catch (Exception e) {
                return "Failed to upload " + myName + " => " + e.getMessage();
            }
        } else {
            return "Failed to upload " + myName + " empty file.";
        }
    }

}

当我在get方法上设置断点时,我看到该方法被命中并返回fileUpload。html视图。然而,post方法根本没有命中。

我不知道这是否相关,但我在项目属性中已将部署程序集-/src/main/resources设置为“/”。这是我在部署程序集配置中唯一的条目。

我以前读过,旧的spring boot RC版本在文件上传时有一个bug。我目前使用的是spring boot 1.0.2.0版本。我的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.0.2.RELEASE</version>
    </parent>


    <groupId>sync</groupId>
    <artifactId>syncServer</artifactId>
    <name>syncServer</name>

    <!-- When removing the parent project configuration you have to explicitly set the dependencies version -->
    <dependencies>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate}</version>
        </dependency>
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901.jdbc4</version>
        </dependency>

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>${tomcat8.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
            <version>8.0.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>

        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>3.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>3.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>3.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity3</artifactId>
        </dependency>
        <dependency>
            <groupId>nz.net.ultraq.thymeleaf</groupId>
            <artifactId>thymeleaf-layout-dialect</artifactId>
            <version>1.2.1</version>
        </dependency>
    </dependencies>

    <version>1.0-SNAPSHOT</version>

    <build>
        <defaultGoal>test</defaultGoal>
        <plugins>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>

            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>

                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <useSystemClassLoader>false</useSystemClassLoader>
                </configuration>
            </plugin>


        </plugins>



    </build>



  <repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>

        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>


    </pluginRepositories>

    <properties>
        <java-version>1.7</java-version>
        <spring-version>4.0.2.RELEASE</spring-version>
        <org.aspectj-version>1.6.10</org.aspectj-version>
        <org.slf4j-version>1.7.6</org.slf4j-version>
        <start-class>org.syncServer.core.Application</start-class>
        <springBootVersion>1.0.2.RELEASE</springBootVersion>
        <tomcat8.version>8.0.3</tomcat8.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hibernate>4.3.1.Final</hibernate>
    </properties>



</project>

这里添加的是注释中要求的完整html代码:

<!DOCTYPE html>


<html>
  <head>
<title>Task List - syncServer File upload example</title>

    <link rel="stylesheet" type="text/css" media="all" href="/css/syncServer.css" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script src="/js/jquery.js"></script>



</head>

  <body>
     <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">My project</a>
        </div>
        <div class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
            <li class="active"><a href="/">Home</a></li>
            <li><a href="/message">OpenSource</a></li>
            <li><a href="/task">Documents</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">
<!--             <li th:if="${#authorization.expression('!isAuthenticated()')}"> -->
<!--               <a href="/signin" th:href="@{/signin}">Sign in</a> -->
<!--             </li> -->
<!--             <li th:if="${#authorization.expression('isAuthenticated()')}"> -->
<!--               <a href="/logout" th:href="@{/logout}">Logout</a> -->
<!--             </li> -->
          </ul>
        </div>
      </div>
    </div>
    <div class="container">
      <div>

    <div>
        <form enctype="multipart/form-data" method="post" action="/upload">
            <fieldset>
                     <legend>File to upload:</legend>
                     <input type="file" name="myFile" />
                     <label>Name :</label>
                     <input type="text" name="myName" />
                     <input type="submit" />
            </fieldset>
    </form>
    </div>

    </div>
      <div>
      © 2014
      <br />
      Autumn, Winter, Summer , Spring is always inside.
    </div>
    </div>
  </body>
</html>

添加2:指向正在工作的maven项目的链接,显示问题

https://github.com/TheDictator/sArchitecture

为了重现登录,请执行以下操作:

用户名:admin2密码:#password

并转到

http://127.0.0.5:8080/upload

上面描述的错误消息见。

附加3

当我删除了我之前在应用程序类中的入口点邮件之前声明的bean时,我的特定问题得到了修复,即

@Bean
public ServletRegistrationBean dispatcherRegistration() {

    System.out.println("SERVLET REGISTRATION");
    ServletRegistrationBean registration = new ServletRegistrationBean(
            dispatcherServlet());

    System.out.println("SERVLET REGISTERED NAME is: "
            + registration.getServletName().toString());
    registration.addUrlMappings("/");

    return registration;
}

我自己还没有回答这个问题,因为我还不明白为什么这种代码的平静会破坏上传功能。

共有1个答案

裴嘉许
2023-03-14

您自己注册调度程序Servlet(而不是让Spring Boot来做),因此您必须注意为其添加多部分配置。Spring Boot只将多部分配置添加到它自己创建的ServletRegistrationBeans中(见这里),所以如果你创建自己的配置,你必须照顾好它。希望ServletRegistrationBean的API足够清晰,如果不是很明显,这是隐含的。

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

  • 因此,我是Spring的新手,我正在尝试让文件上传为我的项目工作(顺便说一句,我正在使用Spring工具套件),提交表单时,我得到的只是: HTTP状态500-无法解析多部分servlet请求;嵌套异常为java。lang.IllegalStateException:无法处理部件,因为未提供多部件配置 从浏览器堆栈跟踪: 这是jsp中的表单标记: 输入部分: 照片存储在此字段中的艺术家对象: 控制

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

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

  • 我有一个简单的POM(见下文)。当我执行mvn部署时,我得到这个错误: [错误]无法执行目标组织。阿帕奇。专家plugins:maven deploy plugin:2.7:project piccolotest上的部署(默认部署):部署失败:未在POM inside distributionManagement元素或-DaltDeploymentRepository=id::layout::ur

  • 问题内容: 我当然缺少有关喷油器的一些基本知识,但是我无法理解为什么 还有这个 按预期工作,而这 会抛出 错误:[$ injector:unpr]未知提供程序:$ provideProvider <-$ provide 如下所述,与提供者有一些特殊的关系,而与实例打交道时,我不确定使块如此特别的东西。 结果,是否没有办法到达外部块,例如,使用(尽管似乎也获得了提供者实例)? 除了好奇心外,这个问题