============ Problem Description ============
Younger brother beginner Android development. Recently need to do a picture upload function.
I was using Java to develop Android, calling C # WebService. Find a lot of information on the Internet, almost all with ksoap2 bag.
Please note that what I want to do is not ksoap the package.
My current method is to read from the Android to the image to be uploaded, with Base64 encoded into a byte stream string, by calling WebService the string as a parameter to the server side, the service side decoding the string, and finally saved to the corresponding path. The key to the entire upload process is data transfer in a byte stream string.
The function code is as follows:
WebService:
Public string uploadimage (string filename, string image) { filestream fs = null; try { string toDir = "e:\\c# project\\dev\ \gprsdatain\\gprsdatain\\images "; fs = new filestream (filename, filemode.create); byte[] buffer = Encoding.UTF8.GetBytes (image); fs. Write (BuffEr, 0, buffer. Length); fs. Flush (); fs. Close (); return "Upload pictures successfully!" + "Picture path:" + toDir; } catch (Exception e) { } return "Upload picture Failed! "; }
Android: Calling the WebService method
public class Uploadutil {private static Httpconnsoap Soap = new Httpconnsoap ();p ublic static void Uploadimage (String filen Ame, String image) {arraylist<string>arraylist=new arraylist<string> (); Arraylist<string>brraylist=new arraylist<string> (); Arraylist.clear (); Brraylist.clear (); Arraylist.add ("filename"); Arraylist.add ("image"); Brraylist.add (filename); Brraylist.add (image); Soap.getwebservre ("Uploadimage", ArrayList, Brraylist);}}
public class httpconnsoap {/** * gets the returned InputStream, which is not parsed within the method in order to enhance commonality. * * @param methodName * webservice method name * @param Parameters * webservice method corresponding parameter name * @param ParValues * Values for parameters in the webservice method * @return Unresolved Inputstream */public inputstream getwebservre (string methodname, arraylist< string> parameters, arraylist<string> parvalues) {// Specify the URL address, I use constants here. string serverurl = "Http://www.bsri.com.cn:99/ws3/Service1.asmx";// soapaction = Namespace + method name string soapaction = "http://tempuri.org/" + methodname;// Patchwork requestdatastring soap = "<? Xml version=\ "1.0\" encoding=\ "utf-8\"?> "+ " <soap:envelope xmlns:xsi=\ "/http Www.w3.org/2001/xmlschema-instance\ " xmlns:xsd=\" Http://www.w3.org/2001/xmlschema\ " xmlns:soap=\" Http://schemas.xmlsoap.org/soap/envelope/\ ">" + "<soap:Body />"; string tps,vps,ts; string mreakstring = ";mreakstring = " < " + methodName + " xmlns=\ "http://tempuri.org/\" > "; for (int i = 0; i < parameters.size (); i++) { tps = parameters.get (i). toString (); //sets the parameter for the method to. Net Parameter names in the webservice vps = parvalues.get (i). Tostring (); ts = new string (" < " + tps + " > " + vps + " </" + tps + " > "); mreakstring = mreakstring + ts; }mreakstring = mreakstring + "</" + methodName + ">"; string soap2 = "</soap:Envelope>"; string requestdata = soap + mreakstring + soap2;// All of the data on it is pieced together requestdata, that is, the data sent to the server Try {url url = new url (ServerURL); // Specify server address httpurlconnection con = (httpurlconnection) url.openconnection ();// open link byte[] bytes = requestdata.getbytes ("Utf-8"); // Specify the encoding format, can solve the problem of Chinese garbled con.setdoinput (true); // Specifies whether the link can be entered Con.setdooutput(true); // Specifies whether the link can output Con.setusecaches (false); // Specifies whether the link is used only with cachescon.setconnecttimeout ( 6000); // set time-out Con.setrequestmethod ("post"); // Specify the method name to send, including POST and get. Con.setrequestproperty ("Content-type", "Text/xml;charset=utf-8"); // Set (Sent) content type Con.setrequestproperty ("SOAPAction", soapaction); // Specify Soapactioncon.setrequestproperty ("Content-length", "" + bytes.length); // specified content length// Send data Outputstream outstream = con.getoutputstream (); outstream.write (bytes); Outstream.flush (); Outstream.close ();// obtain data// con.connect (); Bufferedinputstream ois = new bufferedinputstream (Con.getinputstream ());byte[] Revbytes = new byte[20480];ois.read (revbytes);//inputstream inputstream = new bytearrayinputstream (revbytes); String s = new string (revbytes); String news = s.replaceall ("<", "<"); STring news1 = news.replaceall (">", ">"); Bytearrayinputstream bais = new bytearrayinputstream (News1.getbytes ()); Return bais;} catch (exception e) {e.printstacktrace (); return null;}}
Trigger Upload Method:
@Overridepublic void onclick (view v) {switch (V.getid ()) {case r.id.selectimage:/*** * This is called Android built-in Intent, to filter the image file  , but also can filter other */intent intent = new intent (); Intent.settype ("image/*"); Intent.setaction (intent.action_get_content); Startactivityforresult (intent, 1);break;case r.id.uploadimage:if (picPath == null) {toast.maketext (upload.this, "Please select the picture! ", 1000). Show ();} else {final file file = new file (Picpath);if (file != null) {uploadutil.uploadimage (Imgname, photodata);}} Break;default:break;}} @Overrideprotected void onactivityresult (int requestcode, int resultcode, intent data) {if (RESULTCODE&NBSP;==&NBSP;ACTIVITY.RESULT_OK) {/** * when the selected picture is not empty, The way to get to the picture */uri uri = data.getdata ();try {cursor cursor = GetcontentresolveR (). Query (Uri, null, null,null, null);if (cursor != null) {contentresolver cr = this.getcontentresolver (); Cursor.movetofirst (); String path = cursor.getstring (1); // picture file path imgname = cursor.getstring (3); // picture filename if (path.endswith ("jpg") | | path.endswith ("PNG")) {picPath = path; Bitmap bitmap = bitmapfactory.decodestream (Cr.openinputstream (URI)); ImageView.setImageBitmap ( Bitmap); Fileinputstream fis = new fileinputstream (path); Bytearrayoutputstream baos = new bytearrayoutputstream ();byte[] buffer = new byte[20480];int count = 0;while (count = fis.read (buffer)) >= 0) {baos.write (buffer, 0, count);} Byte[] bytes = baos.tobytearray ();p hotodata = base64.encodetostring (bytes, Base64.default);} else {alerT ();}} else {alert ();}} catch (exception e) {}}super.onactivityresult (requestcode, resultcode, data);}
I feel there is no problem in theory, but actually, when executing to call WebService, when stitching requests, TS = new String ("<" + TPS + ">" + VPS + "</" + TPS + ">"); The picture-to-Base64 encoded string string is too long to cause memory overflow.
How to solve, hope you great God advice! Or something wrong with the program, ask the gods to point it out, or teach me the right way. I don't have much of a brother, please forgive me.
============ Solution 1============
Void submiegson (string users) {try {httpclient httpclient = new Defaulthttpclient (); Httppost httppost = new httppost ("Http://*/jsonws/frank/ftocservice/getuserinfo"); List<namevaluepair> namevaluepairs = new arraylist<namevaluepair> (); Namevaluepairs.add (New basicnamevaluepair ("Users", users); Namevaluepairs.add (new Basicnamevaluepair ("File", getfilestring ())); Httppost.setentity (New urlencodedformentity ( Namevaluepairs,http. Utf_8)); Httpresponse response = httpclient.execute (HttpPost); System.out.println ("rescode =" +response.getstatusline (). Getstatuscode ());if (Response.getstatusline ( ). Getstatuscode () == 200) {string str = entityutils.tostring (Response.getEntity ( ), "Utf-8"); System.out.println ("json ========" +str); Message msg = message.obtain (); Msg.obj = str;mhandler.sendmessage (msg);}} catch&nbSP; (exception e) {e.printstacktrace ();}}
String getfilestring () {string fileStream = null; FileInputStream fis;try {fis = new FileInputStream (Environment.getexternalstoragedirectory (). GetPath () + "/QuickCheck /image/temp.png "); Bytearrayoutputstream BAOs = new Bytearrayoutputstream (); byte[] buffer = new Byte[1024];int count = 0;while ((count = fis. Read (buffer)) >= 0) {baos.write (buffer, 0, count);} Fis.close (); fileStream = new String (Base64.encode (Baos.tobytearray (), Base64.default)); BASE64 encoding} catch (FileNotFoundException e) {e.printstacktrace ();} catch (IOException e) {e.printstacktrace ();} return fileStream;}
Submit using Post
About Android calling C # WebService upload picture problem (do not use KSOAP2)