Как отправить multipart / form-данные с помощью Spring RestTemplate? - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу отправить POST запрос на конечную точку отдыха. остальная конечная точка документация гласит:

Создайте узел и добавьте его в качестве основного дочернего элемента nodeId узла.

Эта конечная точка поддерживает как JSON, так и multipart / form-data (загрузка файла).

Использование multipart / form-data

Используйте поле filedata для представления содержимого для загрузки, например, следующая команда curl создаст узел с содержимое test.txt в домашней папке тестового пользователя.

curl -utest: test -X POST хост: порт / alfresco / api / -default- / public / alfresco / версии / 1 / узлы / - my- / children -F filedata=@test.txt

Вы можете использовать поле имени, чтобы задать альтернативное имя для нового файла.

Вы можете использовать поле nodeType, чтобы создать специфику c тип. Значение по умолчанию: 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!

1 Ответ

0 голосов
/ 11 апреля 2020

Возможно, этот пример будет полезен, чтобы узнать, как вы можете загрузить один или несколько файлов с помощью 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...