Spring Boot分段上传得到空文件对象 [英] Spring Boot multipart upload getting null file object
问题描述
使用spring boot 1.5.2实现多部分文件上传时出现问题。
这是情况,我有一个映射来处理文件上传过程。当我启动spring服务器时,它启动时没有任何错误。问题是我要么能够完美地上传文件,要么在FileBucket对象的所有属性上为null 。
如果我不关闭服务器,这种情况将永远保持。
- 如果可以上传,则会在剩下的时间内上传。
-
-
$ b $如果不是这样,它将不会工作,直到我重新启动服务器(可能超过
时间) b
这是映射。
@RequestMapping(value = {/ api / upload} ,method = RequestMethod.POST)
public ResponseEntity< Map< String,Integer>>上传(@Valid FileBucket fileBucket,BindingResult结果)抛出IOException {
Session session = sessionFactory.openSession();
User user =(User)session.load(User.class,getUserId());
地图< String,Integer> model = new HashMap< String,Integer>();
if(result.hasErrors()){
System.out.println(validation errors);
System.out.println(result);
session.close();
返回新的ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
} else {
int documentId = saveDocument(fileBucket,user);
model.put(documentId,documentId);
session.close();
返回新的ResponseEntity< Map< String,Integer>>(model,HttpStatus.OK);
$ b $FileBucket < code $>
$ private私人MultipartFile文件;
public MultiFile getFile(){
return file;
}
public void setFile(MultipartFile file){
this.file = file;
我已经尝试了很多方法来实现文件上传,仍然有相同的情况。使用StandardServletMultipartResolver
。
-
@Bean(name =multipartResolver)
Standard StandardServletMultipartResolver解析器(){
返回新的StandardServletMultipartResolver ();
$ / code $ / pre $使用CommonsMultipartResolver $ c $
c> v1.3.2。
@Bean(name =multipartResolver)
public CommonsMultipartResolver multipartResolver(){
CommonsMultipartResolver解析器= new CommonsMultipartResolver();
resolver.setMaxUploadSize(MAX_FILE_SIZE);
返回解析器;
覆盖
MultipartFilter
@Bean
@Order(0)
public MultipartFilter multipartFile(){
MultipartFilter multipartFilter = new MultipartFilter();
multipartFilter.setMultipartResolverBeanName(multipartResolver);
返回multipartFilter;
启用
spring.http.multipart
在属性文件中spring.http.multipart.enabled = true
spring.http。 multipart.max-file-size = 20Mb
spring.http.multipart.max-request-size = 20Mb
我真的不知道从哪里开始寻找。问题偶尔会发生,但每次启动服务器时都不会发生这种情况,但大部分时间都是这样。希望有人能帮助我。
谢谢。
解决方案我有同样的问题,是我的解决方案:
在application.yml中:
spring:
http:
multipart:
启用:false
:
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
...
@Bean
public MultiResolver multipartResolver(){
return new CommonsMultipartResolver();
$ b在RestController中:
pre $@PostMapping(value =api / upload,consumes =multipart / form-data)
public void enablePurchase(@RequestHeader HttpHeaders header,
FileBucketConversation fileBucketConversation){
...
}
重要: / strong>
在您的客户端中,请勿使用任何标题来定义内容类型或边界。我使用的是Angular 4,当我从代码中删除这些头文件时,它可以工作(我只设置了用户令牌):
pre $/ *不要使用这个:
让boundary =ABDCE;
headers.append(Content-type,multipart / form-data; boundary =+ boundary);
headers.append(enctype,multipart / form-data; boundary =+ boundary);
headers.append(boundary,boundary);
* /
我希望这可以帮到您。
I am getting a problem while implementing multipart file upload using spring boot 1.5.2.
Here is the situation, I have a mapping to handle file upload process.While I start the spring server, it starts without any error. The problem is that I would either able to upload the file perfectly fine or I would get null on all attribute in FileBucket object.
This situation would stay forever if I do not shutdown the server.
- If it could upload, it would upload fine for the rest of the time.
- If not, it won't work until I restart the server(likely more than one time)
Here is the mapping.
@RequestMapping(value = {"/api/upload"}, method = RequestMethod.POST) public ResponseEntity<Map<String, Integer>> upload(@Valid FileBucket fileBucket, BindingResult result) throws IOException { Session session = sessionFactory.openSession(); User user = (User) session.load(User.class, getUserId()); Map<String, Integer> model = new HashMap<String, Integer>(); if (result.hasErrors()) { System.out.println("validation errors"); System.out.println(result); session.close(); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } else { int documentId = saveDocument(fileBucket, user); model.put("documentId", documentId); session.close(); return new ResponseEntity<Map<String, Integer>>(model, HttpStatus.OK); } }
And the
FileBucket
objectpublic class FileBucketConversation { private MultipartFile file; public MultipartFile getFile() { return file; } public void setFile(MultipartFile file) { this.file = file; } }
I have tried few ways to implement file upload, and still having the same situation.
Using
StandardServletMultipartResolver
.@Bean(name = "multipartResolver") public StandardServletMultipartResolver resolver() { return new StandardServletMultipartResolver(); }
Using
CommonsMultipartResolver
v1.3.2.@Bean(name="multipartResolver") public CommonsMultipartResolver multipartResolver () { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(MAX_FILE_SIZE); return resolver; }
overriding
MultipartFilter
@Bean @Order(0) public MultipartFilter multipartFile() { MultipartFilter multipartFilter = new MultipartFilter(); multipartFilter.setMultipartResolverBeanName("multipartResolver"); return multipartFilter; }
Enable
spring.http.multipart
in properties filespring.http.multipart.enabled=true spring.http.multipart.max-file-size=20Mb spring.http.multipart.max-request-size=20Mb
I really have no clue where to start looking. The problem happen occasionally, it do not happen every time I start the server but most of the time. Hoping some one could help me.
Thank you.
解决方案I had the same problem, this is my solution:
In application.yml:
spring: http: multipart: enabled: false
In configuration:
import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; ... @Bean public MultipartResolver multipartResolver() { return new CommonsMultipartResolver(); }
In RestController:
@PostMapping(value = "api/upload", consumes = "multipart/form-data") public void enablePurchase(@RequestHeader HttpHeaders headers, FileBucketConversation fileBucketConversation) { ... }
Important: In your client don't use any header to define the Content-type or boundary. I'm using Angular 4 and when I remove these headers from my code it works (I only set the User token):
/* DON'T USE THIS: let boundary = "ABDCE"; headers.append("Content-type", "multipart/form-data;boundary=" + boundary); headers.append("enctype", "multipart/form-data;boundary=" + boundary); headers.append("boundary", boundary); */
I hope this help you.
这篇关于Spring Boot分段上传得到空文件对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
-