我正在尝试使用假客户端将文件上载到restapi。如下所示,效果良好。
@PostMapping(value = "/test/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity<String> upload(@RequestPart(value = "data") MultipartFile zipFile);
为了创建更新的多部分文件,我这样做,
public MultipartFile createFile(){
String zipFilePath = "some/path/to/file";
File file = new File(zipFilePath);
FileItem fileItem = new DiskFileItem(FIELD_NAME, Files.probeContentType(file.toPath()), false,
file.getName(), (int) file.length(), file.getParentFile());
try (InputStream input = new FileInputStream(file); OutputStream output = fileItem.getOutputStream()){
IOUtils.copy(input, output);
}
return new CommonsMultipartFile(fileItem);
}
调用外部客户机时,正在使用从上述方法创建的多部分文件。而不是创建 CommonsMultipartFile
如上所述,加载到内存中,我决定加载到一个 Resource
如下所示,
public Resource createFile(){
String zipFilePath = "some/path/to/file";
Resource resource = new FileSystemResource(zipFilePath );
return resource;
}
并像这样更改了外部客户机方法,但在外部客户机中不是这样工作的。
@PostMapping(value = "/test/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity<String> upload(@RequestPart(value = "data") Resource zipFile);
我得到一个错误 Status: 409 CONFLICT. Body: Nothing to upload
来自的响应 /test/upload
终结点。但是后来我试着用一个rest模板上传资源,这个模板可以很好地将资源作为文件数据,
public ResponseEntity<String> uploadFile(Resource file){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
HttpEntity<Resource> fileResource = new HttpEntity<>(file);
parts.add("data", fileResource);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(parts, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
}
什么原因是它不能在外部客户机中将资源类型作为部分数据传递。我用的是Spring Boot2.x。
1条答案
按热度按时间dy2hfwbg1#
有一些东西不同于你的设置和我的工作。
首先,我在rest控制器中使用@requestparam而不是@requestpart,尽管我没有使用假客户机,只是一个普通的rest控制器,所以这里可能不适用,但我的看起来更像这样。
然后,在我的post方法中,我做了如下操作: