POST два InputStreams в запросе javax - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь отправить запрос в конечную точку, которая принимает форму с двумя файлами.Метод, который я сейчас пытаюсь выполнить, завершается с ошибкой в ​​последней строке:

WebTarget client = myUtils.createClient(URL, ENDPOINT);

MultivaluedMap<String, InputStream> formData = new MultivaluedHashMap<>();
formData.add(FILE_1, stream1);
formData.add(FILE_2, stream2);

Entity<MultivaluedMap<String, InputStream>> entity = Entity.entity(formData, MediaType.MULTIPART_FORM_DATA_TYPE);

Response response = client.request().post(entity);

Достигнута ошибка:

javax.ws.rs.ProcessingException: RESTEASY003215: could not find writer for content-type multipart/form-data type: javax.ws.rs.core.MultivaluedHashMap

Изменение MediaType на APPLICATION_FORM_URLENCODED_TYPE приводит к

java.lang.ClassCastException: java.io.SequenceInputStream cannot be cast to java.lang.String

Есть ли лучший способ обработки POST-формы с двумя файлами?

1 Ответ

0 голосов
/ 26 октября 2018

Есть несколько способов.Если вы используете Джерси, Один из способов - сделать что-то вроде:

import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
....
....
   FileDataBodyPart fileDataBodyPart = 
             new FileDataBodyPart("file", new File("/filelocation/file.txt"));
    FormDataMultiPart formDataMultiPart = (FormDataMultiPart) 
                        FormDataMultiPart.field("somekey","somevalue")
                             .bodyPart( fileDataBodyPart);

     WebTarget target = client.target(restServiceURLYouwant);
     Response response = target.request().post(Entity.entity(formDataMultiPart, 
      formDataMultiPart.getMediaType()));

       formDataMultiPart.close();

Другой способ - использовать Apache HttpUtils

 import org.apache.http.entity.mime.MultipartEntity;
 import org.apache.http.entity.mime.content.FileBody;
 ....
 ....
 MultipartEntity multipartEntity = new MultipartEntity();
 FileBody fb = new FileBody(file, "application/octet-stream");
 multipartEntity.addPart(fb);

 HttpClient httpClient = new DefaultHttpClient() ;
 HttpPost httpPostRequest = new HttpPost (url) ; 
    //url above should be url of the Rest service endpoint
 httpPostRequest.setEntity(multiPartEntity) ;
               
 HttpResponse response = httpClient.execute(httpPostRequest) ;
...