今天做一個圖片上傳,上傳上去老是顯示不出來。上傳的方法是將圖片的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();