我正在尝试将一个grails应用程序与一个springboot应用程序进行通信。我试图上传一个文件到springboot应用程序,该文件之前已经上传到了grails。
@ResponseBody
@PostMapping(value = "/save", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
def save(@Valid @ModelAttribute SaveRequest request) {
//Some logic
}
saveRequest类包含了一些需要应用到请求中的验证。
class SaveHotelAccreditationRequest {
//Other fields
@NotNull
MultipartFile image
}
我在application.properties文件中设置了如下属性。
spring.http.multipart.enabled = true
spring.http.multipart.location=/home/user/temp
我使用的是Apache的commons-io和commons-fileupload两个库,我把多部分解析器设置成这样。
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(2*1024*1024);
return multipartResolver;
}
这是我的grails应用程序中的代码
CredentialsProvider credsProvider = new BasicCredentialsProvider()
credsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials(userName, password))
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build()
try {
HttpPost httpPost = new HttpPost(url)
MultipartEntityBuilder reqEntity = MultipartEntityBuilder.create()
reqEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
reqEntity.addBinaryBody('image', file, ContentType.MULTIPART_FORM_DATA, file.getName())
//Other fields
httpPost.setEntity(reqEntity.build())
System.out.println("Executing request " + httpPost.getRequestLine())
CloseableHttpResponse response = httpclient.execute(httpPost)
try {
System.out.println("----------------------------------------")
System.out.println(response.getStatusLine())
System.out.println(EntityUtils.toString(response.getEntity()))
} finally {
response.close()
}
} finally {
httpclient.close()
}
当我运行请求时,我得到以下错误信息。
2020-05-02 02:37:24 | WARN | org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolved
exception caused by Handler execution: org.springframework.validation.BindException: org.springframework.validatio
n.BeanPropertyBindingResult: 1 errors
Field error in object 'saveHotelAccreditationRequest' on field 'image': rejected value [null]; codes [NotNull.saveRequest.image,NotNull.image,NotNull.org.springframework.web.multipart.MultipartFile,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [saveRequest.image,image]; arguments []; default message [image]]; default message [may not be null]
我试过用postman,也得到同样的错误信息. 我不知道我在这里遗漏了什么,希望得到任何帮助。
在Spring-Boot REST的多部分API中,我正在写我的多部分API,就像这样。
@PostMapping("/upload-doc")
@ApiImplicitParam(paramType = "body", name = "payload", dataType = "UploadDocRequest")
@ResponseStatus(HttpStatus.CREATED)
@ApiOperation("Upload User's documents")
public UploadDocRequest uploadDocRequest(
@RequestPart("payload") UploadDocRequest payload, @RequestPart("docs") MultipartFile[] docs) {
在yaml中配置Spring Multipart
spring:
servlet:
multipart:
max-file-size: 5MB
max-request-size: 5MB
在使用Multipart时,我在Spring启动时使用了下面的方法。
@PostMapping(value = "/uploadVideo")
public void uploadVideo(HttpServletRequest request, HttpServletResponse response,
@RequestParam("file") MultipartFile file) throws Exception {
// logic here
}
你所使用的最大尺寸的多部分解析器可以在属性文件中配置,如下所示
# Max file size.
spring.servlet.multipart.max-file-size=200MB
# Max Request Size
spring.servlet.multipart.max-request-size=215MB
我从Angular App中调用的这个是这样的
var reqHeader=new HttpHeaders();
reqHeader.append('contentType','multipart/form-data')
let options = { headers: reqHeader, params: new HttpParams()
};
const formData = new FormData();
formData.append('file', file )
return this.http.post(this.url_toreadFile,formData,options)
希望能给你的实施提供一些帮助。