这篇文章主要介绍了详解Spring Boot中PATCH上传文件的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
spring boot中上传multipart/form-data文件只能是post提交,而不针对patch,这个问题花了作者26个小时才解决这个问题,最后不得不调试spring源代码来解决这个问题。
需求:在网页中构建一个表单,其中包含一个文本输入字段和一个用于文件上载的输入。很简单。这是表单:
var fileinput = ...; //this is html element that holds the files
var textinput = ...; //thi is the string
var fd = new formdata();
fd.append('definition',fileinput.files[0]);
fd.append('name', textinput );
xhr = new xmlhttprequest();
xhr.open( 'patch', uploadform.action, true );
xhr.send( fd );
但无论怎么做,我都无法让它发挥作用。总是遇到以下异常:
missingservletrequestpartexception: required request part ‘definition' is not present
@configuration
public class myconfig {
@bean
public multipartresolver multipartresolver() {
return new commonsmultipartresolver();
}
}
这还需要将commons-fileupload库添加到类路径中。
但每当我添加一个字符串变量返回错误:the string field not the file field
这说明multi part request resolver 没有发现这部分字段。
这是由于javascript的formdata问题,在formdata对象上调用的append方法接受两个参数name和value(有第三个但不重要),该value字段可以是一个 USVString或Blob(包括子类等File)。更改代码为:
var fileinput = ...; //this is html element that holds the files
var textinput = = new blob(['the info'], {
type: 'text/plain'
});
; //thi is the string
var fd = new formdata();
fd.append('definition',fileinput.files[0]);
fd.append('name', textinput );
xhr = new xmlhttprequest();
xhr.open( 'patch', uploadform.action, true );
xhr.send( fd );
它突然开始工作:)。
看一下浏览器发送的内容:
— — — webkitformboundaryhgn3yjdgselbgmzh
content-disposition: form-data; name=”definition”; filename=”test.csv” content-type: text/csv
this is the content of a file, browser hides it.
— — — webkitformboundaryhgn3yjdgselbgmzh content-disposition: form-data; name=”name”
this is the string
— — — webkitformboundaryhgn3yjdgselbgmzh —