Загрузка нескольких файлов в сервис REST с использованием Jersey - PullRequest
1 голос
/ 09 июля 2019

Довольно много ссылок здесь, которые предлагают использовать multipart/form-data и как загрузить файл здесь.Не удалось найти файл для комбинации нескольких файлов, загруженных с помощью команды CURL, и для службы REST, принимающей FormDataMultiPart.

Код службы в настоящее время выглядит следующим образом:

@javax.ws.rs.POST
@javax.ws.rs.Path("/sample-bulk")
@javax.ws.rs.Consumes(javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA)
public javax.ws.rs.core.Response bulkUpload(@FormDataParam("file") org.glassfish.jersey.media.multipart.FormDataMultiPart multiPart) {
    log.info("{} log", multiPart.getField("file"));
    return Response.ok().build();
}

и CURL, который я пытаюсь вызвать службой, выглядит так:

curl -X POST "http://localhost:37200/api/sample-bulk" -H "принять: application / json" -H "Тип содержимого: multipart / form-data" -F "file = @ / Users / naman / Desktop / Media / video.mp4; type = video/ mp4 "

Но это приводит к тому, что multiPart будет null на службе и, конечно, NPE.

Что-нибудь глупое, что я пропустил здесь?

Ответы [ 3 ]

2 голосов
/ 10 июля 2019

Проблема с параметром метода (наличие @FormDataParam)

public Response bulkUpload(@FormDataParam("file") FormDataMultiPart multiPart) {}

@FormDataParam используется, когда вы хотите декларативно извлечь отдельные детали из составной частиrequest, тогда как FormDataMultiPart используется для получения всего составного тела, а программно для извлечения каждой части. Возможно иметь вложенную составную часть, где полная составная часть является отдельной деталью (в этом случае то, что у вас будет работать), но здесь это не так.

Если вы удалите@FormDataParam("file"), тогда он будет работать как положено.Вы можете начать извлечение деталей из составной части, используя метод, который вы используете getField(fieldName).Это даст вам FormDataBodyPart за каждую часть, которую вы извлекаете.Вы можете получить данные с помощью FormDataBodyPart#getValueAs(InputStream.class), если вы хотите эту часть как InputStream, или вы можете использовать File.class или byte[].class, независимо от ваших предпочтений.Вот как можно извлечь данные из FormDataMultiPart.

Каждая часть имеет свое собственное имя, и вы извлекаете часть, используя это имя.В случае вашего запроса cURL вы отправили одну часть, и имя этой части - file.то есть "file=@/Users/...".Поэтому, если вы хотите отправить другую часть, просто добавьте другой параметр с другим именем, , как упомянуто Владимиром :

curl -X POST "http://localhost:37200/api/sample-bulk"\
     -H "accept: application/json"\
     -H "Content-Type: multipart/form-data"\
     -F "file1=@/Users/naman/Desktop/Media/video.mp4"\
     -F "file2=@/Users/naman/Desktop/Media/another_video.mp4"

Как я упоминал ранее, @FormDataParam используется для извлечениячасти декларативно.Вы используете имя детали в качестве значения аннотации.Таким образом, с помощью предыдущей команды cURL вы можете выполнить.

public Response bulkUpload(
        @FormDataParam("file1") InputStream file1,
        @FormDaraParam("file1") FormDataContentDisposition file1Fdcd,
        @FormDataParam("file2") InputStream file2,
        @FormDaraParam("file2") FormDataContentDisposition file2Fdcd) {
}

Вы можете получить информацию о детали, такую ​​как имя файла, из FormDataContentDisposition.

См. Также

1 голос
/ 16 июля 2019
Use this parameter 

public Response uploadFile(@FormDataParam("files") List<FormDataBodyPart> file) 

Use for loop

 for (int j = 0; j < files.size(); j++) {
   FormDataBodyPart this_formDataBodyPartFile = files.get(j);
   ContentDisposition this_contentDispositionHeader = this_formDataBodyPartFile
                                                    .getContentDisposition();
   InputStream this_fileInputStream = this_formDataBodyPartFile.getValueAs(InputStream.class);
                                            FormDataContentDisposition fileDetail = (FormDataContentDisposition) this_contentDispositionHeader;

//Write the code upload code   }
0 голосов
/ 09 июля 2019

Попробуйте использовать отдельный флаг -F для каждой составной записи, например:

curl -X POST «http://localhost:37200/api/sample-bulk" -H "принять: application / json" -H "Тип содержимого: multipart / form-data" -F "file=@/Users/naman/Desktop/Media/video.mp4" -F "type = video / mp4"

...