Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >Spring+Tomcat8.0.3 FileUpload错误无法处理部件,因为没有提供多部件配置

Spring+Tomcat8.0.3 FileUpload错误无法处理部件,因为没有提供多部件配置
EN

Stack Overflow用户
提问于 2014-05-12 00:33:03
回答 1查看 6.6K关注 0票数 0

我有一个工作的春季启动mvc应用程序,在那里,我试图集成一个文件上传选项。根据手册,我配置了以下模板:

/src/main/resource/templates/fileUpload.html

代码语言:javascript
代码运行次数:0
复制
<!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/上传表单时,会显示表单,但当我单击submit按钮时就会显示。错误信息

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

I去禁用csrf,以便查看如果禁用跨站点请求伪造(".csrf().disable()"),表单是否能简单地工作。即

代码语言:javascript
代码运行次数:0
复制
   @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.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套异常为java.lang.IllegalStateException:无法处理部件,因为没有提供多部分配置。

它说“没有提供多个部分的配置”,但是我确实有配置文件来配置multipartConfigElement,即

代码语言:javascript
代码运行次数:0
复制
@Configuration
public class FileUpload {
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultiPartConfigFactory factory = new MultiPartConfigFactory();
        factory.setMaxFileSize("600KB");
        factory.setMaxRequestSize("600KB");
        return factory.createMultipartConfig();
    }
}

我还有@ComponentScan指定和@EnableAutoConfiguration在我的应用程序类之上,即:

代码语言:javascript
代码运行次数:0
复制
@ComponentScan(basePackages = "org.syncServer.*")
@Configuration
@EnableWebSocketMessageBroker
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {
...
}

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

与fileUpload.html关联的控制器:

代码语言:javascript
代码运行次数:0
复制
@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方法根本没有被击中。

我不知道这是否相关,但我已经在Properties Deployment /src/main/resources中设置为"/“,这是我在部署程序集配置中拥有的唯一条目。

我以前读过,在旧的spring引导RC版本中有一个bug,文件上传。我目前使用的是spring 1.0.2.RELEASE。

代码语言:javascript
代码运行次数:0
复制
<?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代码:

代码语言:javascript
代码运行次数:0
复制
<!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项目

代码语言:javascript
代码运行次数:0
复制
https://github.com/TheDictator/sArchitecture

为了复制登录,请使用:

用户名: admin2密码:#密码

然后去

代码语言:javascript
代码运行次数:0
复制
http://127.0.0.5:8080/upload

请参阅上面描述的错误消息。

加法3

当我删除以前在应用程序类中的入口点邮件之前声明的bean时,我的特殊问题就解决了。

代码语言:javascript
代码运行次数:0
复制
@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;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-16 21:37:13

您自己注册DispatcherServlet (而不是让Spring来注册),所以您必须注意为它添加多部分配置。Spring只向它自己创建的ServletRegistrationBeans (请看这里)添加多部分配置,所以如果您创建了自己的配置,那么就必须处理它。希望ServletRegistrationBean的API足够清楚,这是隐含的,如果不是显而易见的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23604357

复制
相关文章
将文档导出为pdf
使用QTextDocument与QPrinter实现文档导出为PDF的小示例。 #include <QtWidgets> /* 需要为项目文件添加QT += printsupport */ #include <QPrinter> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPrinter printer(QPrinter::PrinterResolution); printer.setOut
Qt君
2019/11/24
1.4K0
将XML文档表示为DOM
%XML.Document类和%XML.Node类使可以将任意XML文档表示为DOM(文档对象模型)。然后,可以导航此对象并对其进行修改。还可以创建一个新的DOM并将其添加到其中。
用户7741497
2022/07/05
4650
JS深度判断两个对象字段相同
代码: /** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype.toString.call(obj)==='[object Object]'; }; /** * 判断此类型是否是Array类型 * @param {Array} arr */ function isArray(arr){ return Object.prototype.to
莫问今朝
2018/11/12
3.6K0
Java去除对象中为null的字段
如果返回的是对象 model 转成的 json,那么 json 中会存在 “xxxx” : null。和前端进行交互时在使用Swagger调试接口的时候会出现接口数据中有 null值,结果很难看:
Jensen_97
2023/07/20
7890
Java去除对象中为null的字段
利用反射比较两个对象字段值是否相等
import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import org.apache.log4j.Logger;public class DomainEquals { /** * 日志操作类 */ private static Logger logger = Logger.getLogger(Domain
java达人
2018/01/31
3.6K0
JavaScript对对象数组的两个字段排序
sort应该也能比较中文,应该是按照汉字编码数值来,具体还没有翻文档和测试下。但在本次案例种,还是得转换成期望比较顺序的数值。
celineWong7
2023/10/16
4490
JavaScript对对象数组的两个字段排序
Java 将两个Map对象合并为一个Map对象
实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式。
程序员十三
2018/12/28
4.6K0
HDFS——如何将文件复制到HDFS
在Hadoop中用作文件操作的主类位于org.apache.hadoop.fs包中。基本的文件操作有open、read、write和close。实际上,Hadoop的文件API是通用的,可用于HDFS以外的文件系统。
星哥玩云
2022/06/30
2K0
MongoDB 文档字段增删改
//$set修改器最常用,等同于RDBMS update的set子句 //演示重用的的示例集合数据请参考:mongoDB 比较运算符
Leshami
2018/08/08
1.4K0
将文件内容复制到另外文件
在示例类Demo.FileDemo中,ProcessFile()方法接受输入文件和输出文件,并调用SetUpInputFile()和SetUpOutputFile()打开文件,一个用于读取,另一个用于写入。然后,它逐行读取输入文件,并调用ProcessLine()对每行的内容执行一个或多个替换,将每行的新内容写入输出文件。
用户7741497
2022/07/06
9900
python 对象 特殊字段
https://www.cnblogs.com/zh1164/p/6031464.html
小贝壳
2020/03/05
8450
文档对象模型
DOM是针对HTML和XML文档的一个API(应用程序编程接口),DOM描绘了一个层次化的节点树,允许开发人员添加,移除,修改页面的某一部分。1998年10月DOM1级规范成为W3C的推荐标准,为基本的文档结构以及查询提供了接口。但是要注意,IE中的所有DOM对象都是以COM对象的形式实现的。这意味着IE中的DOM对象与原生JavaScript对象的行为或活动特点并不一致。
小小鱼儿小小林
2020/06/24
1.1K0
JavaScript文档对象
前两章,我们已经把window对象详细给大家探讨了一遍。这次我们介绍另一个网页中核心的对象:“document对象”。注意,document对象是window对象中的子对象。
Qwe7
2022/04/09
4000
Oracle将远程库复制到本地库
exp username/password@192.168.1.1:1521/orcl file=C:/database.dmp
在下是首席架构师
2022/08/18
1.1K0
js将内容复制到剪贴板
在js中通过点击事件来触发复制到剪贴板,通过js的document.execCommand("Copy");语法可以实现复制功能,但是首先需要将文本选中,来看一下实际代码:
OECOM
2020/07/01
4K0
JavaScript 覆盖对象字段级别
下列的代码可以实现a和b两个对象进行覆盖合并,不同于object.asgin 会覆盖。下列的代码只会字段级覆盖。
小贝壳
2020/09/09
8990
Mybatis-plus 在不修改全局策略和字段注解的情况下将字段更新为null
mybatis-plus 以下简称mp,目前应该也算是主流的一款数据访问层应用框架。源于其对mybatis 的近乎完美的封装,让我们在使用的时候无比的顺滑, 几乎提供了所有单表操作的方法,大大提升了效率。并且这款框架还是国产的哦,没了解过的可以去了解一下。
一缕82年的清风
2021/12/06
2K0
Mybatis-plus 在不修改全局策略和字段注解的情况下将字段更新为null
DOM 文档对象模型
HTML 模板<html> <head> <title>我是网站标题</title> </head> <body> <div class="box"> <div class="box1"></div> </div> <div name="xiaoming"></div> <div id="box"></div> </body></html>访问节点通过 id 访问指定节点 getElement
菜园前端
2023/05/10
4850
将本地文件复制到Hadoop文件系统
//将本地文件复制到复制到Hadoop文件系统 //目前,其他Hadoop文件系统写入文件时均不调用progress()方法。 package com;
星哥玩云
2022/07/04
1.4K0
点击加载更多

相似问题

将A类对象的每个字段复制到列表中classB对象的每个字段中

226

Avro -为每个字段添加文档/描述

124

为每个对象设置不同的字段

10

Mongoose为给定字段获取每个值的单个文档

24

结果为每个文档返回不同的输出字段。

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文