Spring 网络客户端 multipart/form-data 请求
Spring Webclient multipart/form-data request
我是 Java(Spring 启动)的新手,我正在尝试向 s3 发送 multipart/form-data
POST 请求以上传文件。
我设法使用 spring 的 RestTemplate
做到了这一点:
public String uploadFile(byte[] file, Map<String, Object> fields, String url) throws URISyntaxException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> formData= new LinkedMultiValueMap<String, Object>();
for (Map.Entry<String, Object> entry : fields.entrySet()) {
formData.add(entry.getKey(), entry.getValue());
}
formData.add("file", file);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(formData, headers);
String response = restTemplate.postForObject(new URI(url), request, String.class);
return response;
}
然后我尝试使用 webclient
做同样的事情,但我做不到,AWS 回应 The body of your POST request is not well-formed multipart/form-data.
这是使用 webclient 的代码:
public String uploadFileWebc(byte[] file, Map<String, Object> fields, String url) {
MultipartBodyBuilder builder = new MultipartBodyBuilder();
for (Map.Entry<String, Object> entry : fields.entrySet()) {
builder.part(entry.getKey(), entry.getValue(), MediaType.TEXT_PLAIN);
}
builder.part("file", file).filename("file");
MultiValueMap<String, HttpEntity<?>> parts = builder.build();
Void result = webClient.filter(errorHandlingFilter()).build().post().uri(url)
.contentType(MediaType.MULTIPART_FORM_DATA)
.contentLength(file.length)
.bodyValue(parts)
.retrieve()
.bodyToMono(Void.class)
.block();
return "Done Uploading.";
}
任何人都可以指出我错过了什么吗?
事实证明,webclient
由于其流媒体特性而没有添加content-length
header,而S3 API需要这个header已发送。
我最终使用 restTemplate
将文件上传到 S3。
我是 Java(Spring 启动)的新手,我正在尝试向 s3 发送 multipart/form-data
POST 请求以上传文件。
我设法使用 spring 的 RestTemplate
做到了这一点:
public String uploadFile(byte[] file, Map<String, Object> fields, String url) throws URISyntaxException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> formData= new LinkedMultiValueMap<String, Object>();
for (Map.Entry<String, Object> entry : fields.entrySet()) {
formData.add(entry.getKey(), entry.getValue());
}
formData.add("file", file);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(formData, headers);
String response = restTemplate.postForObject(new URI(url), request, String.class);
return response;
}
然后我尝试使用 webclient
做同样的事情,但我做不到,AWS 回应 The body of your POST request is not well-formed multipart/form-data.
这是使用 webclient 的代码:
public String uploadFileWebc(byte[] file, Map<String, Object> fields, String url) {
MultipartBodyBuilder builder = new MultipartBodyBuilder();
for (Map.Entry<String, Object> entry : fields.entrySet()) {
builder.part(entry.getKey(), entry.getValue(), MediaType.TEXT_PLAIN);
}
builder.part("file", file).filename("file");
MultiValueMap<String, HttpEntity<?>> parts = builder.build();
Void result = webClient.filter(errorHandlingFilter()).build().post().uri(url)
.contentType(MediaType.MULTIPART_FORM_DATA)
.contentLength(file.length)
.bodyValue(parts)
.retrieve()
.bodyToMono(Void.class)
.block();
return "Done Uploading.";
}
任何人都可以指出我错过了什么吗?
事实证明,webclient
由于其流媒体特性而没有添加content-length
header,而S3 API需要这个header已发送。
我最终使用 restTemplate
将文件上传到 S3。