android sending encoded image to webservice not working -
i have created, following tutorial (a lot of them) how upload after choosing gallery proved not hard after trying while fixed source of problem proved when sending encoded image web service. have test web service separately using online decoded image string , works wonders when send string android casues error , crashes app.
android code
import android.app.progressdialog; import android.content.context; import android.content.intent; import android.database.cursor; import android.graphics.bitmap; import android.graphics.drawable.bitmapdrawable; import android.net.uri; import android.os.asynctask; import android.provider.mediastore; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.util.base64; import android.util.log; import android.util.pair; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.imageview; import android.widget.toast; import org.apache.http.params.httpparams; import org.json.jsonexception; import org.json.jsonobject; import java.io.bufferedreader; import java.io.bytearrayoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.net.httpurlconnection; import java.net.malformedurlexception; import java.net.url; import java.util.arraylist; import java.util.hashmap; import java.util.list; public class mainactivity extends appcompatactivity implements view.onclicklistener{ private static final int result_load_img = 1; imageview uploadme, downloadme; button buttonup, buttondown; edittext textup, textdown; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); uploadme = (imageview) findviewbyid(r.id.imagetoupload); downloadme = (imageview) findviewbyid(r.id.imagetodownload); buttonup = (button) findviewbyid(r.id.buttonuploadimage); buttondown = (button) findviewbyid(r.id.buttondownloadimage); textup = (edittext) findviewbyid(r.id.uploadname); textdown = (edittext) findviewbyid(r.id.downloadname); uploadme.setonclicklistener(this); buttonup.setonclicklistener(this); buttondown.setonclicklistener(this); } @override public void onclick(view v) { switch (v.getid()) { case r.id.imagetoupload: intent galleryintent = new intent(intent.action_pick, mediastore.images.media.external_content_uri); startactivityforresult(galleryintent, result_load_img); break; case r.id.buttonuploadimage: bitmap image = ((bitmapdrawable) uploadme.getdrawable()).getbitmap(); bytearrayoutputstream bytearrayoutputstream = new bytearrayoutputstream(); image.compress(bitmap.compressformat.jpeg, 100, bytearrayoutputstream); string encodedimage = base64.encodetostring(bytearrayoutputstream.tobytearray(), base64.default); string url = "url php file/upload_image.php?image=" + encodedimage + "&name=" + textup.gettext().tostring(); //crashes when send string here new jsontask().execute(url); break; case r.id.buttondownloadimage: break; } } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if (requestcode == result_load_img && resultcode == result_ok && data != null) { uri selectedimg = data.getdata(); uploadme.setimageuri(selectedimg); } } public class jsontask extends asynctask<string, void, void> { string error, content; @override protected void doinbackground(string... params) { httpurlconnection connection = null; bufferedreader reader = null; try { url url = new url(params[0]); connection = (httpurlconnection) url.openconnection(); connection.connect(); inputstream stream = connection.getinputstream(); reader = new bufferedreader(new inputstreamreader(stream)); stringbuffer buffer = new stringbuffer(); string line = ""; while ((line = reader.readline()) != null) { buffer.append(line); } content = buffer.tostring(); } catch (malformedurlexception e) { error = e.getmessage(); e.printstacktrace(); } catch (ioexception e) { error = e.getmessage(); e.printstacktrace(); } { if (connection != null) connection.disconnect(); try { if (reader != null) reader.close(); } catch(ioexception e) { e.printstacktrace(); } } return null; } @override protected void onpostexecute(void result) { super.onpostexecute(result); if (error != null) { log.d("json", error); } else { string output = ""; jsonobject jsonresponse; try { jsonresponse = new jsonobject(content); toast.maketext(mainactivity.this, jsonresponse.getstring("success"), toast.length_short).show(); } catch (exception e) { e.printstacktrace(); } } } } } i tried fix messed up. there way fix without changing everything? maybe connection class stacktrace
01-27 21:21:47.232 4205-4205/com.blablabla.exportimagetest d/dalvikvm: gc_for_alloc freed 9429k, 31% free 17075k/24628k, paused 0ms, total 0ms 01-27 21:21:47.242 4205-4205/com.blablabla.exportimagetest d/dalvikvm: gc_for_alloc freed 2341k, 23% free 19115k/24628k, paused 10ms, total 10ms 01-27 21:21:47.342 4205-4221/com.blablabla.exportimagetest d/dalvikvm: gc_for_alloc freed 5395k, 17% free 18628k/22240k, paused 0ms, total 0ms 01-27 21:21:47.392 4205-4221/com.blablabla.exportimagetest d/dalvikvm: gc_for_alloc freed 2071k, 18% free 19436k/23696k, paused 0ms, total 0ms 01-27 21:21:47.482 4205-4221/com.blablabla.exportimagetest d/dalvikvm: gc_for_alloc freed 2707k, 18% free 21144k/25576k, paused 0ms, total 0ms 01-27 21:21:47.492 4205-4221/com.blablabla.exportimagetest d/dalvikvm: gc_for_alloc freed 3155k, 19% free 22399k/27456k, paused 0ms, total 0ms 01-27 21:21:47.512 4205-4221/com.blablabla.exportimagetest d/dalvikvm: gc_for_alloc freed 4382k, 24% free 22399k/29336k, paused 0ms, total 0ms 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: java.io.eofexception 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.android.okhttp.internal.util.readasciiline(util.java:318) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.android.okhttp.internal.http.rawheaders.frombytes(rawheaders.java:308) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.android.okhttp.internal.http.httptransport.readresponseheaders(httptransport.java:135) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.android.okhttp.internal.http.httpengine.readresponse(httpengine.java:644) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.android.okhttp.internal.http.httpurlconnectionimpl.execute(httpurlconnectionimpl.java:347) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.android.okhttp.internal.http.httpurlconnectionimpl.getresponse(httpurlconnectionimpl.java:296) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.android.okhttp.internal.http.httpurlconnectionimpl.getinputstream(httpurlconnectionimpl.java:179) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.blablabla.exportimagetest.mainactivity$jsontask.doinbackground(mainactivity.java:116) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ com.blablabla.exportimagetest.mainactivity$jsontask.doinbackground(mainactivity.java:101) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ android.os.asynctask$2.call(asynctask.java:288) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ java.util.concurrent.futuretask.run(futuretask.java:237) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ android.os.asynctask$serialexecutor$1.run(asynctask.java:231) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1112) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:587) 01-27 21:21:49.602 4205-4221/com.blablabla.exportimagetest w/system.err: @ java.lang.thread.run(thread.java:841) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: java.lang.nullpointerexception 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ org.json.jsontokener.nextcleaninternal(jsontokener.java:116) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ org.json.jsontokener.nextvalue(jsontokener.java:94) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ org.json.jsonobject.<init>(jsonobject.java:155) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ org.json.jsonobject.<init>(jsonobject.java:172) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ com.blablabla.exportimagetest.mainactivity$jsontask.onpostexecute(mainactivity.java:172) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ com.blablabla.exportimagetest.mainactivity$jsontask.onpostexecute(mainactivity.java:101) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ android.os.asynctask.finish(asynctask.java:632) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ android.os.asynctask.access$600(asynctask.java:177) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ android.os.asynctask$internalhandler.handlemessage(asynctask.java:645) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ android.os.handler.dispatchmessage(handler.java:102) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ android.os.looper.loop(looper.java:136) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ android.app.activitythread.main(activitythread.java:5021) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ java.lang.reflect.method.invokenative(native method) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ java.lang.reflect.method.invoke(method.java:515) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:827) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ com.android.internal.os.zygoteinit.main(zygoteinit.java:643) 01-27 21:21:49.612 4205-4205/com.blablabla.exportimagetest w/system.err: @ dalvik.system.nativestart.main(native method) edit
httpurlconnection connection = null; bufferedreader reader = null; string urlparms = "image=" + encodedimage + "&name=" + namevalue; byte[] postdata = urlparms.getbytes( standardcharsets.utf_8 ); int postdatalength = postdata.length; try { url url = new url("http://192.168.1.2/web%20service%20owner_tenant/upload_image.php"); connection = (httpurlconnection) url.openconnection(); connection.setrequestmethod("post"); connection.setdoinput(true); connection.setdooutput(true); connection.setusecaches(false); connection.setrequestproperty("content-type", "application/x-www-form-urlencoded"); connection.setrequestproperty("charset", "utf-8"); connection.setrequestproperty( "content-length", integer.tostring( postdatalength )); dataoutputstream wr = new dataoutputstream( connection.getoutputstream()); wr.write(postdata); wr.flush(); wr.close(); connection.connect(); inputstream stream = connection.getinputstream(); reader = new bufferedreader(new inputstreamreader(stream)); stringbuffer buffer = new stringbuffer(); string line = ""; while ((line = reader.readline()) != null) { buffer.append(line); } content = buffer.tostring(); php script
<?php //array json response $response = array(); require_once __dir__ . '/connect.php'; $cnx = new db_connect(); $db = $cnx->connectme(); if (!empty($_request['name']) && $_request['name'] != null && !empty($_request['image']) && $_request['image'] != null) { $name = $_request['name']; $image = $_request['image']; $response['error'] = "a | "; $decodedimage = base64_decode("$image"); if (!$file = fopen("pictures/" . $name . ".png", 'wb')) { $response['error'] .= 'failed open | '; } if (fwrite($file, $decodedimage) === false) { $response['error'] .= 'failed write'; } fclose($file); //will handled correct response later $response['success'] = '1'; echo json_encode($response); } else { $response['success'] = '0'; $response['message'] = 'missing or empty parameter(s)'; echo json_encode($response); } ?>
update
had, in last run 1 final error in web service had add this
$image = str_replace(' ', '+', $image);
you put image in url parameter request. not can send small amount of bytes in url. should use post method.
Comments
Post a Comment