前提
现在的项目要求我们图片上传的时候使用Base64上传图片,我原来的做法是这样的
Bitmap smallBitmap = null;
String base64Url = null;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
options.inJustDecodeBounds = false;
smallBitmap = BitmapFactory.decodeFile(filePath, options);
byte[] photoData = BitmapUtil.bitmap2bytes(smallBitmap);
base64Url = Base64.encodeToString(photoData, Base64.NO_WRAP);
} catch (Exception e) {
e.printStackTrace();
base64Url = "";
}
1.获取到图片的Bitmap
2.将Bitmap转化为byte[]
3.将byte[]转化为string
** 在第一步会导致接下来的值变大,在第一步会导致接下来的值变大,在第一步会导致接下来的值变大 **
比如说图片50K,然后从步骤2到步骤3会导致返回的string变为100K(根据手机的屏幕高宽和屏幕密度而不同)
解决方案
// https://mvnrepository.com/artifact/commons-codec/commons-codec base64库
compile group: 'commons-codec', name: 'commons-codec', version: '1.5'
int size = (int) file.length();
byte[] bytes = new byte[size];
try {
BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
buf.read(bytes, 0, bytes.length);
buf.close();
} catch (Exception e) {
LogUtils.e("base64 文件转byte64", e);
}
byte[] encodedBytes = org.apache.commons.codec.binary.Base64.encodeBase64(bytes);
byte[] decodedBytes = org.apache.commons.codec.binary.Base64.decodeBase64(encodedBytes);
String base64Url = Base64.encodeToString(decodedBytes, Base64.NO_WRAP);
1.gradle引入apache公司的Base64帮助类
2.使用如上代码,虽然会也会变大,但是没那么夸张了.
最后
上传图片最好别使用Base64这种方式,可以使用requestbody,multipart这两种试试, 我还没有试过.