簡體   English   中英

如何使用 Spring RestTemplate 發送多部分/表單數據?

[英]How to send multipart/form-data with Spring RestTemplate?

我想向 rest 端點發送POST請求。 rest 端點文檔說:

創建一個節點並將其添加為節點 nodeId 的主要子節點。

此端點同時支持 JSON 和 multipart/form-data(文件上傳)。

使用多部分/表單數據

使用 filedata 字段表示要上傳的內容,例如,下面的 curl 命令將在測試用戶的主文件夾中創建一個包含 test.txt 內容的節點。

curl -utest:test -X POST 主機:port/alfresco/api/-default-/public/alfresco/versions/1/nodes/-my-/children -F filedata=@test.txt

您可以使用名稱字段為新文件提供替代名稱。

您可以使用 nodeType 字段來創建特定類型。 默認為 cm:content

我設法通過以下代碼向該端點發送了正確的請求:

@Override
public ResponseEntity<byte[]> postNode(String nodeId, byte[] content) {
  MultiValueMap<String, Object> bodyMap = new LinkedMultiValueMap<>();
ByteArrayResource contentsAsResource = new ByteArrayResource(content) {
    @Override
    public String getFilename() {
        return "name22222";
    }
};

  bodyMap.add("filedata", contentsAsResource);

  ///bodyMap.add("filedata", content);// why this does not work??!

  HttpHeaders headers = new HttpHeaders();
  headers.setContentType(MediaType.MULTIPART_FORM_DATA);
  HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(bodyMap, headers);
        return restTemplate.exchange("/nodes/{nodeId}/children", HttpMethod.POST, requestEntity, byte[].class, nodeId);
}

但我有兩個問題:

1 - 為什么注釋行不起作用?

2 - 文檔說:

您可以使用名稱字段為新文件提供替代名稱。

我沒有使用"name"字段,但是服務器使用正確的名稱(= "name22222" )保存了我的文件,為什么?(我認為multipart/form-data是一種簡單的名稱值,如果這是正確然后我有一個名為“filedata”的字段,它的值是我的byte數組內容,那么文件名是如何發送的?)。 以及如何使用字段指定文件名?

更新:我想我找到了答案。 我只需要閱讀有關multipart/form-data

也許此示例有助於了解如何使用 Spring 上傳一個或多個文件。


     byte[] fileContent = "testFileContent".getBytes();
     String filename = "testFile.xml";

     MultiValueMap<String, String> fileMap = new LinkedMultiValueMap<>();
     ContentDisposition contentDisposition = ContentDisposition
         .builder("form-data")
         .name("file")
         .filename(filename)
         .build();

     fileMap.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());
     HttpEntity<byte[]> fileEntity = new HttpEntity<>(fileContent, fileMap);

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

     HttpHeaders headers = new HttpHeaders();
     headers.setContentType(MediaType.MULTIPART_FORM_DATA);

     HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);

     ResponseEntity<String> response = restTemplate
         .postForEntity("/import/file, requestEntity, String.class);

暫無
暫無

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

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