簡體   English   中英

Android:通過Http Get或Post Request將圖像作為byte []發送

[英]Android : Sending image as byte[] by Http Get or Post Request

我需要將圖像上傳到Web服務器,並且它要求ImageContent在它說base64Binary的文檔中位於byte []中,但是我嘗試了base64編碼的字符串,沒有用

那是我的課:

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>

您可以在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)

也嘗試一下。 如果仍然失敗,則必須檢查服務器。 Atleast提供負責處理此問題的服務器方法。

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)

使用獲取請求並使用

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

我相信這應該可行。 我真的很抱歉我的糟糕,我應該沒有犯過如此愚蠢的錯誤/

我沒有找到一種方法,只能發送整個SOAP信封

因此,從后台線程AsyncTask執行時,我調用了callSOAPWebService(String data)

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();

}

希望對將來有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM