feign客户端多部分文件作为资源上传

t1rydlwq  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(394)

我正在尝试使用假客户端将文件上载到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。

dy2hfwbg

dy2hfwbg1#

有一些东西不同于你的设置和我的工作。
首先,我在rest控制器中使用@requestparam而不是@requestpart,尽管我没有使用假客户机,只是一个普通的rest控制器,所以这里可能不适用,但我的看起来更像这样。

@PostMapping(value = "/test/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity<String> upload(@RequestParam(value = "data") MultipartFile zipFile);

然后,在我的post方法中,我做了如下操作:

public ResponseEntity<String> uploadFile(Resource file){
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);

    MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
    parts.add("data", file); 

    HttpEntity<MultiValueMap<String,Object>> request = new HttpEntity<>(parts,headers);

    ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
}

相关问题