[英]Spring Boot multipart upload getting null file object
使用spring boot 1.5.2实现多部分文件上载时遇到问题。
这是情况,我有一个映射来处理文件上传过程。当我启动spring服务器时,它启动没有任何错误。 问题是我要么能够完全上传文件,要么在FileBucket对象中的所有属性上都为null 。
如果我不关闭服务器,这种情况将永远存在。
这是映射。
@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);
}
}
和FileBucket
对象
public class FileBucketConversation {
private MultipartFile file;
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
}
我已经尝试了几种方法来实现文件上传,并且仍然具有相同的情况。
使用StandardServletMultipartResolver
。
@Bean(name = "multipartResolver") public StandardServletMultipartResolver resolver() { return new StandardServletMultipartResolver(); }
使用CommonsMultipartResolver
v1.3.2。
@Bean(name="multipartResolver") public CommonsMultipartResolver multipartResolver () { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(MAX_FILE_SIZE); return resolver; }
重写MultipartFilter
@Bean @Order(0) public MultipartFilter multipartFile() { MultipartFilter multipartFilter = new MultipartFilter(); multipartFilter.setMultipartResolverBeanName("multipartResolver"); return 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:
enabled: false
在配置中:
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
...
@Bean
public MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
在RestController中:
@PostMapping(value = "api/upload", consumes = "multipart/form-data")
public void enablePurchase(@RequestHeader HttpHeaders headers,
FileBucketConversation fileBucketConversation) {
...
}
重要提示:在您的客户端中,不要使用任何标头来定义内容类型或边界。 我正在使用Angular 4,当我从我的代码中删除这些标题时,它可以工作(我只设置用户标记):
/* 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);
*/
我希望这对你有帮助。
Spring Boot 2和Spring 5的更新
不推荐使用spring.http.multipart.enabled
,所以spring.http.multipart.enabled
它。
为MultipartConfigElement
或MultipartResolver
注册我自己的bean打破了它。
我最终得到了一个带有单个参数的@PostMapping
方法, @PostMapping
@RequestPart(name = "file") MultipartFile file
。 添加参数@RequestHeader HttpHeader headers
帮助我确保客户端发送带边界的所需标头Content-Type。
我正在使用带有表单数据库和节点获取的Node客户端。 这是客户端代码:
const formData = new FormData();
const fileMetadata = {filename: fileName, contentType: 'image/png', knownLength: fs.statSync(pathToFile)};
const formData.append('file', fs.createReadStream(pathToFile), fileMetadata);
fetch(url, {method: 'POST', body: formData});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.