首页 > 解决方案 > 在 javax 请求中发布两个 InputStream

问题描述

我正在尝试向采用包含两个文件的表单的端点发送请求。我目前正在尝试的方法在最后一行失败:

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

更改MediaTypeAPPLICATION_FORM_URLENCODED_TYPE收益率

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

有没有更好的方法来处理 POST 带有两个文件的表单?

标签: javarestresteasy

解决方案


有多种方法。如果您使用的是泽西岛,一种方法是执行以下操作:

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) ;

推荐阅读