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
Post a Comment