android okhttp3使用base64字符串上傳圖片問題

今天做一個圖片上傳,上傳上去老是顯示不出來。上傳的方法是將圖片的bitmap轉成base64字符串,然後將這串字符串上傳到服務器。

bitmap轉base64字符串的方法:

//將bitmap轉成Base64字符串
public static String bitmapToBase64(Bitmap bitmap) {
    ByteArrayOutputStream bos=new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);//參數100表示不壓縮
    byte[] bytes=bos.toByteArray();
    //Base64算法加密,當字符串過長(一般超過76)時會自動在中間加一個換行符,字符串最後也會加一個換行符。
    // 導致和其他模塊對接時結果不一致。所以不能用默認Base64.DEFAULT,而是Base64.NO_WRAP不換行
    return new String(Base64.encode(bytes, Base64.NO_WRAP));
}

然後我反覆檢驗了不是bitmap轉base64的問題,而且後臺也說後臺處理沒問題,那麼唯一的可能就是數據傳輸時的問題了,於是我用Log打印出我上傳時的base64字符串,然後與後臺拿到請求時的base64字符串進行比對。問題馬上出來了,base64字符串果然傳到後臺就變了,1、出現了反斜槓,2、+號變成了空格。那麼接下要改的地方就是我的請求參數了,由於base64字符串中有很多符號,如果不進行處理有的會轉義,因此這裏就要用URLEncoder.encode();把base64字符串包起來,然後還要將字符串中的反斜槓去掉String data=json.toString().replace(“\”,”“);做完這些再去測試就沒有問題了。

//上傳圖片
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    final JSONObject json = new JSONObject();
                    json.put("siteId", share.getString("siteid", ""));
                    json.put("logo", str);
                    json.put("logoSuffix", ".jpg");
                    String data=json.toString().replace("\\","");
                    OkHttpClient client = new OkHttpClient();
                    String url = null;
                    try {
                        url = "agentid=1&token=" + URLEncoder.encode(Token.gettoken(), "utf-8") + "&json=" + URLEncoder.encode(data, "utf-8");
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
                    RequestBody body = RequestBody.create(mediaType, url);
                    final Request request = new Request.Builder()
                            .url(URL)
                            .post(body)
                            .build();

                    client.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {

                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            Log.i("infoss", response.body().string());
                        }
                    });

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章