使用Spring 4 restTemplate上传MultipartFile列表(Java客户端和RestController)
问题内容:
我正在尝试使用spring
restTemplate将MultipartFile列表发布到我的RestController,尽管我对于用于客户端和控制器的确切语法和类型有些困惑。到目前为止,根据我所做的研究,我得到的是…
FileUploadClient.java
public void uploadFiles(List<MultipartFile> multiPartFileList) throws IOException {
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
List<Object> files = new ArrayList<>();
for(MultipartFile file : multiPartFileList) {
files.add(new ByteArrayResource(file.getBytes()));
}
map.put("files", files);
// headers is inherited from BaseClient
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.exchange(restURI + "/rest/fileupload/uploadfiles", HttpMethod.POST, request, String.class);
if(HttpStatus.OK.equals(response.getStatusCode())) {
System.out.println("status for /rest/fileupload/uploadfiles ---> " + response);
}
}
FileUploadRestController.java
@RequestMapping(value = "/uploadfiles", method = RequestMethod.POST)
public ResponseEntity<?> uploadFiles(@RequestParam("files") List<MultipartFile> files, HttpServletRequest request) {
ResponseEntity<?> response;
try {
// do stuff...
response = new ResponseEntity<>(header, HttpStatus.OK);
System.out.println("file uploaded");
} catch (Exception e) {
// handle exception
}
return response;
}
web.xml
<filter>
<filter-name>multipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>multipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
spring-servlet.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- max upload size in bytes -->
<property name="maxUploadSize" value="20971520" /> <!-- 20MB -->
<!-- max size of file in memory (in bytes) -->
<property name="maxInMemorySize" value="1048576" /> <!-- 1MB -->
</bean>
如果我正确理解。multipart筛选器应将我的MultiValueMap解析为MultipartFiles列表和MultipartHttpServletRequest?我可以让我的客户使用RestController的唯一方法是将文件数据作为ByteArrayResource发送,但是在我的控制器中,我的RequestBody始终为null,并且MultipartHttpServletRequest的multipartFiles属性具有空映射。我查看了许多帖子以尝试解决此问题,但无济于事。任何帮助将非常感激。
问题答案:
您似乎request
从发送的有效负载FileUploadClient
与服务器期望的负载不匹配。您可以尝试更改以下内容吗?
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
for(MultipartFile file : multiPartFileList) {
map.add(file.getName(), new ByteArrayResource(file.getBytes()));
}
至
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
List<ByteArrayResource> files = new ArrayList<>();
for(MultipartFile file : multiPartFileList) {
files.add(new ByteArrayResource(file.getBytes()));
}
map.put("files", files);
另外,您是否可以尝试将服务器的方法签名更改为以下内容:
public ResponseEntity<?> uploadFiles(@RequestParam("files") List<MultipartFile> files, HttpServletRequest request) {
更新资料
同时上传多个文件,你需要确保getFileName
的ByteArrayResource
每次都返回相同的值。如果没有,您将总是得到一个空数组。
例如,以下对我有用的作品:
客户:
MultiValueMap<String, Object> data = new LinkedMultiValueMap<String, Object>();
for(MultipartFile file : multiPartFileList) {
ByteArrayResource resource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return "";
}
};
data.add("files", resource);
}
服务器
public ResponseEntity<?> upload(@RequestParam("files") MultipartFile[] files){