java - Volley: MultipartRequest.getBody: IOException writing to ByteArrayOutputStream -


i using volley api call. need post image sever.

i have tried many multipartrequest implementation, none works.

i tried using sample how send “multipart/form-data” post in android volley az_.

but multipartrequest.getbody: ioexception writing bytearrayoutputstream error.

can me out on code, or know complete sample uploading image using volley please. thank you.

import java.io.bytearrayoutputstream; import java.io.file; import java.io.filteroutputstream; import java.io.ioexception; import java.io.outputstream; import java.io.unsupportedencodingexception; import java.util.hashmap; import java.util.map;  import org.apache.http.httpentity; import org.apache.http.entity.contenttype; import org.apache.http.entity.mime.httpmultipartmode; import org.apache.http.entity.mime.multipartentitybuilder; import org.apache.http.entity.mime.content.filebody; import org.apache.http.util.charsetutils;  import com.android.volley.authfailureerror; import com.android.volley.networkresponse; import com.android.volley.request; import com.android.volley.response; import com.android.volley.volleylog;   //code by: //https://stackoverflow.com/questions/16797468/how-to-send-a-multipart-form-data-post-in-android-with-volley //az_ //  /**  * problems : e/volley﹕ [17225] multipartrequest.getbody: ioexception writing bytearrayoutputstream  */ public class multipartrequest extends request<string> {      multipartentitybuilder entity = multipartentitybuilder.create();     httpentity httpentity;     private string file_part_name = "files";      private final response.listener<string> mlistener;     private final file mfilepart;     private final map<string, string> mstringpart;     private map<string, string> headerparams;     private final multipartprogresslistener multipartprogresslistener;     private long filelength = 0l;         public multipartrequest(string url, response.errorlistener errorlistener,                             response.listener<string> listener, file file, long filelength,                             map<string, string> mstringpart,                             final map<string, string> headerparams, string partname,                             multipartprogresslistener proglitener) {         super(method.post, url, errorlistener);          this.mlistener = listener;         this.mfilepart = file;         this.filelength = filelength;         this.mstringpart = mstringpart;         this.headerparams = headerparams;         this.file_part_name = partname;         this.multipartprogresslistener = proglitener;          entity.setmode(httpmultipartmode.browser_compatible);         try {             entity.setcharset(charsetutils.get("utf-8"));         } catch (unsupportedencodingexception e) {             e.printstacktrace();         }         buildmultipartentity();         httpentity = entity.build();     }         // public void addstringbody(string param, string value) {     // if (mstringpart != null) {     // mstringpart.put(param, value);     // }     // }         private void buildmultipartentity() {         entity.addpart(file_part_name, new filebody(mfilepart, contenttype.create("image/gif"), mfilepart.getname()));         if (mstringpart != null) {             (map.entry<string, string> entry : mstringpart.entryset()) {                 entity.addtextbody(entry.getkey(), entry.getvalue());             }         }     }         @override     public string getbodycontenttype() {         return httpentity.getcontenttype().getvalue();     }      @override     public byte[] getbody() throws authfailureerror {         bytearrayoutputstream bos = new bytearrayoutputstream();         try {             httpentity.writeto(new countingoutputstream(bos, filelength, multipartprogresslistener));         }         catch (ioexception e) {             volleylog.e("ioexception writing bytearrayoutputstream");         }         return bos.tobytearray();     }         @override     protected response<string> parsenetworkresponse(networkresponse response) {          try { //          system.out.println("network response "+ new string(response.data, "utf-8"));             return response.success(new string(response.data, "utf-8"),                     getcacheentry());         } catch (unsupportedencodingexception e) {             e.printstacktrace();             // should never happen though             return response.success(new string(response.data), getcacheentry());         }     }      @override     protected void deliverresponse(string response) {         mlistener.onresponse(response);     }  //override getheaders() if want put in header      public static interface multipartprogresslistener {         void transferred(long transfered, int progress);     }      public static class countingoutputstream extends filteroutputstream {         private final multipartprogresslistener proglistener;         private long transferred;         private long filelength;          public countingoutputstream(final outputstream out, long filelength,                                     final multipartprogresslistener listener) {             super(out);             this.filelength = filelength;             this.proglistener = listener;             this.transferred = 0;         }          public void write(byte[] b, int off, int len) throws ioexception {             out.write(b, off, len);             if (proglistener != null) {                 this.transferred += len;                 int prog = (int) (transferred * 100 / filelength);                 this.proglistener.transferred(this.transferred, prog);             }         }          public void write(int b) throws ioexception {             out.write(b);             if (proglistener != null) {                 this.transferred++;                 int prog = (int) (transferred * 100 / filelength);                 this.proglistener.transferred(this.transferred, prog);             }         }      } } 

user api class

   public void uploadfile(string api, file file, long filelength, string partname, final useruploadsuccesslistener listener) {         this.listener = listener;          string url = constant.domain + api;          map<string, string> mheaderparams = new hashmap<string, string>();         mheaderparams.put("pram", "pramvalue");              multipartrequest multipartrequest = new multipartrequest                 (url, errorlistener, new response.listener<string>() {                      @override                     public void onresponse(string response) {                         listener.onuseruploadfile(response);                     }                   }, file, filelength, null, mheaderparams, partname, null);          multipartrequest.setretrypolicy(new defaultretrypolicy(                 30000, //30 seconds - change want                 defaultretrypolicy.default_max_retries,                 defaultretrypolicy.default_backoff_mult));          mrequestqueue.add(multipartrequest);     } 

then call on mainactivity:

private void test1(){       file file = new file("path:/storage/emulated/0/copy_folder/magazine/images/assets/images/img_0007.jpg");     long filelength = file.length();       new userapi().uploadfile("upload", file, filelength, "imgpost",  new userapi.useruploadsuccesslistener() {          @override         public void onuseruploadfile(string response) {             text.settext("uploadimage() - onuseruploadfile -> \n " + response.tostring());         }          @override         public void onerror(volleyerror error) {              text.settext("uploadimage() - onerror -> \n " + error.tostring());         }          @override         public void onresponseerror(string message) {             text.settext("uploadimage() - onresponseerror -> \n " + message);         }     });   } 

here dependencies in android studio:

dependencies {     compile filetree(dir: 'libs', include: ['*.jar'])     compile 'com.android.support:appcompat-v7:22.2.0'      compile 'com.google.code.gson:gson:2.3'     compile 'com.mcxiaoke.volley:library:1.0.+'       compile('org.apache.httpcomponents:httpmime:4.3.6') {         exclude module: 'httpclient'     }     compile 'org.apache.httpcomponents:httpclient-android:4.3.5'  } 

have found solution yet? if not, can have read @ answer @ how send “multipart/form-data” post in android volley . use multipartentitybuilder build parts.

if don't wanna use httpentity because of deprecation, please take @ working solution working post multipart request volley , without httpentity.

hope helps!


Comments