我有一个工作的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;
}
我自己还没有回答这个问题,因为我还不明白为什么这种代码的平静会破坏上传功能。
您自己注册调度程序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 如下所述,与提供者有一些特殊的关系,而与实例打交道时,我不确定使块如此特别的东西。 结果,是否没有办法到达外部块,例如,使用(尽管似乎也获得了提供者实例)? 除了好奇心外,这个问题