簡體   English   中英

使用Spring RestTemplate和Jackson分段上傳文件

[英]Multipart file upload with spring RestTemplate and Jackson

我想通過調用rest網絡服務來上傳文件。 該Web服務需要一個MultipartFile。

我在這里閱讀可以執行以下操作: 使用Spring Rest模板+ Spring Web MVC進行多部分文件上傳

所以,這是我的代碼:

public Document uploadDocument(MultipartFile file) {
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(backendURL + "documents/upload");
        URI uri = builder.build().encode().toUri();

        LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        map.add("file", file);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity =
                new HttpEntity<LinkedMultiValueMap<String, Object>>(map, headers);

        try {
            ResponseEntity<Document> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, Document.class);
        } catch (Exception e) {
            e.getMessage(); // Crash here
        }

        return document.getBody();
    }

Jackson嘗試以JSON序列化文件,但是由於以下錯誤而失敗:

Could not write content: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: org.springframework.web.multipart.support.StandardMultipartFile["inputStream"]->java.io.FileInputStream["fd"])

如何禁用文件的json序列化?

感謝Jekin Kalariya,我找到了一個可行的解決方案。

我從MultipartFile創建一個臨時文件,並使用它來創建FileSystemResource。 我發送此FileSystemResource而不是MultipartFile。

這是工作代碼:

public DocumentDetailed uploadDocumentInIfs(MultipartFile file, String userProfile) {
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(backendURL + "documents/upload");
    builder.queryParam("user", userProfile);
    URI uri = builder.build().encode().toUri();

    File tempFile = null;
    try {
        String extension = "." + getFileExtention(file.getOriginalFilename());
        tempFile = File.createTempFile("temp", extension);
        file.transferTo(tempFile);
    } catch (IOException e) {
        e.printStackTrace();
    }

    LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    map.add("file", new FileSystemResource(tempFile));
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);

    Document document = null;
    try {
        ResponseEntity<Document> responseEntity =
                restTemplate.exchange(uri, HttpMethod.POST, requestEntity, Document.class);
        document = responseEntity.getBody();
    } catch (Exception e) {
        e.getMessage();
    }

    return document;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM