2015-09-22 242 views
0

我需要上传图像到Web服务器,它需要ImageContent是在字节[]在文档它说base64Binary的,但我想base64编码字符串,没有用安卓:通过HTTP GET或POST请求发送图像的byte []

这是我的课:

private class background extends AsyncTask<byte[],Void,String> { 

    String url = "http://www.sample.com/_mobfiles/CLS_Account.asmx/UploadImage"; 
    String charset = "UTF-8"; 
    String param1 = "jpg"; 

    @Override 
    protected String doInBackground(byte[]... params) { 

     try { 
      String query = String.format("ImageContent=%s&imageExtenstion=%s", params[0], URLEncoder.encode(param2, charset)); 
      URLConnection connection = new URL(url + "?" + query).openConnection(); 
      connection.setRequestProperty("Accept-Charset", charset); 
      InputStream response = connection.getInputStream(); 
      for (Map.Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) { 
       System.out.println(header.getKey() + "=" + header.getValue()); 
      } 
      String contentType = connection.getHeaderField("Content-Type"); 
      String charset = null; 
      for (String param : contentType.replace(" ", "").split(";")) { 
       if (param.startsWith("charset=")) { 
        charset = param.split("=", 2)[1]; 
        break; 
       } 
      } 
      if (charset != null) { 
       try (BufferedReader reader = new BufferedReader(new InputStreamReader(response, charset))) { 
        for (String line; (line = reader.readLine()) != null;) { 
         System.out.println(line); 
        } 
       } 
      } 
      else { 
       ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
       int nRead; 
       byte[] data = new byte[16384]; 
       while ((nRead = response.read(data, 0, data.length)) != -1) { 
        buffer.write(data, 0, nRead); 
       } 
       buffer.flush(); 
       byte[] arr = buffer.toByteArray(); 
       String decoded = new String(arr, "UTF-8"); 
       System.out.println(decoded); 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

返回(java.io.FileNotFoundException)

和Base64编码的回报(java.net.ProtocolException:意外的状态行:对象移动)

这里是文件:


HTTP GET

以下是一个示例HTTP GET请求和响应。显示的占位符与实际值替换。

GET /_mobfiles/CLS_Account.asmx/UploadImage?ImageContent=base64Binary&imageExtenstion=string HTTP/1.1 
Host: www.sample.com 

和响应是象

HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">string</string> 

HTTP POST

以下是一个示例HTTP POST请求和响应。显示的占位符与实际值替换。

POST /_mobfiles/CLS_Account.asmx/UploadImage HTTP/1.1 
Host: www.sample.com 
Content-Type: application/x-www-form-urlencoded 
Content-Length: length 

ImageContent=base64Binary&imageExtenstion=string 

和响应就像

HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">string</string> 
+0

我应该在哪里写的是什么? –

+0

尝试在浏览器上尝试,其中yyy指图像类型,xxxx指向base64编码图像在此尝试https://jsfiddle.net/o4mut2uv/并共享。使用小图像快速。 – user1615664

+0

它显示图像ok –

回答

0

我还没有找到一种方式,但在执行时从后台线程AsyncTask我叫callSOAPWebService(String data)发送整个SOAP信封

所以

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
Bitmap resizedBitmap = Bitmap.createScaledBitmap(thumbnail, 150, 150, false); 
resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100,stream); 
byte[] byteArray = stream.toByteArray(); 
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT); 
new ImageUpload().execute(encoded); 
从UI线程

和背景

@Override 
     protected String doInBackground(String... params) { 
      callSOAPWebService(params[0]); 
      return null; 
     } 

callSOAPWebService是遵循

private boolean callSOAPWebService(String data) { 
     OutputStream out = null; 
     int respCode; 
     boolean isSuccess = false; 
     URL url; 
     HttpURLConnection httpURLConnection = null; 
     try { 
      url = new URL(GetData.NonOpDomain); 
      httpURLConnection = (HttpURLConnection) url.openConnection(); 
      do { 
       httpURLConnection.setRequestMethod("POST"); 
       httpURLConnection.setRequestProperty("Connection", "keep-alive"); 
       httpURLConnection.setRequestProperty("Content-Type", "text/xml"); 
       httpURLConnection.setRequestProperty("SendChunked", "True"); 
       httpURLConnection.setRequestProperty("UseCookieContainer", "True"); 
       HttpURLConnection.setFollowRedirects(false); 
       httpURLConnection.setDoOutput(true); 
       httpURLConnection.setDoInput(true); 
       httpURLConnection.setUseCaches(true); 
       httpURLConnection.setRequestProperty("Content-length", getReqData(data).length + ""); 
       httpURLConnection.setReadTimeout(100 * 1000); 
       // httpURLConnection.setConnectTimeout(10 * 1000); 
       httpURLConnection.connect(); 
       out = httpURLConnection.getOutputStream(); 
       if (out != null) { 
        out.write(getReqData(data)); 
        out.flush(); 
       } 
       respCode = httpURLConnection.getResponseCode(); 
       Log.e("respCode", ":" + respCode); 
      } while (respCode == -1); 

      // If it works fine 
      if (respCode == 200) { 
       try { 
        InputStream responce = httpURLConnection.getInputStream(); 
        String str = convertStreamToString(responce); 
        System.out.println(".....data....." + str); 
        InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8")); 
        XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance(); 
        XmlPullParser myparser = xmlFactoryObject.newPullParser(); 
        myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
        myparser.setInput(is, null); 
        parseXMLAndStoreIt(myparser); 
       } catch (Exception e1) { 
        e1.printStackTrace(); 
       } 
      } else { 
       isSuccess = false; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (out != null) { 
       out = null; 
      } 
      if (httpURLConnection != null) { 
       httpURLConnection.disconnect(); 
       httpURLConnection = null; 
      } 
     } 
     return isSuccess; 
    } 

和辅助方法

public volatile boolean parsingComplete = true; 

public void parseXMLAndStoreIt(XmlPullParser myParser) { 
    int event; 
    String text = null; 
    try { 
     event = myParser.getEventType(); 
     while (event != XmlPullParser.END_DOCUMENT) { 
      String name = myParser.getName(); 

      switch (event) { 
       case XmlPullParser.START_TAG: 
        break; 

       case XmlPullParser.TEXT: 
        text = myParser.getText(); 
        break; 
       case XmlPullParser.END_TAG: 
        if (name.equals("UploadImageResult")) { 
         uploadedImage = text; 
         uploadedImage = uploadedImage.replace("\"", ""); 
        } 
        break; 
      } 
      event = myParser.next(); 
     } 
     parsingComplete = false; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static String createSoapHeader() { 
    String soapHeader; 

    soapHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" 
      + "<soap:Envelope " 
      + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"" 
      + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" 
      + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" + ">"; 
    return soapHeader; 
} 

public static byte[] getReqData(String data) { 
    StringBuilder requestData = new StringBuilder(); 

    requestData.append(createSoapHeader()); 
    requestData.append("<soap:Body>" + "<UploadImage" + " xmlns=\"http://example.org/\">" + "<ImageContent>").append(data).append("</ImageContent>\n").append("<imageExtenstion>jpg</imageExtenstion>").append("</UploadImage> </soap:Body> </soap:Envelope>"); 
    Log.d("reqData: ", requestData.toString()); 
    return requestData.toString().trim().getBytes(); 
} 

private static String convertStreamToString(InputStream is) 
     throws UnsupportedEncodingException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is, 
      "UTF-8")); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return sb.toString(); 

} 

希望这将帮助一些人在未来

0

你可以试试这个在您的Chrome控制台,并告诉输出。

xmlhttp=new XMLHttpRequest(); 
    var url = '/_mobfiles/CLS_Account.asmx/UploadImage?'; 
    var base64 ='R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==' 
    xmlhttp.open("GET",url + 'ImageContent='+base64+'&imageExtenstion=gif',true); 
    xmlhttp.send(); 
    console.log(xmlhttp.response) 

也试试这个。如果这也失败了,你必须检查服务器。至少提供负责处理这个的服务器方法。

xmlhttp=new XMLHttpRequest(); 
var url = '/_mobfiles/CLS_Account.asmx/UploadImage?'; 
var base64 ='R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==' 
xmlhttp.open("POST",true); 
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
xmlhttp.send('ImageContent="'+base64+'"&imageExtenstion="gif"'); 
console.log(xmlhttp) 

使用GET请求,并使用

var base64 ='R0lGODlhDwAPAKECAAAAzMzM%2F%2F%2F%2F%2FwAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH%2BH09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw%3D%3D' 

我相信这应该工作。我真的很对不起我的坏,我应该还没有做出这样愚蠢的错误/

+0

GET http://www.sample.com/_mobfiles/CLS_Account.asmx/UploadImageTes...wWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==&imageExtenstion=gif 500(内部服务器错误) –

+0

状态:404 状态文本: “OK” 上传:XMLHttpRequestUpload withCredentials :假 __proto__:XMLHttpRequest的 –

+0

,并把当URL返回“System.ArgumentException:R0lGODlhDwAPAKECAAAAzMzM ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN​​48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==无法转换为System.Byte 参数名:类型---> System.FormatException:输入字符串没有一个正确的格式。“ –