Android图片上传的两种方式
2023-06-20 12:56阅读:
图片上传,以及带参数的图片上传是Android开发中,很常见的需求。但也是接口联调难度相对比较大的技术实现,本文介绍两种可靠的图片上传方式。一是通过
MultipartBody 来实现;二是通过图片转字符串来实现。
一、通过 MultipartBody 来实现
注意事项和重点,都在注释中说明了,就不再啰嗦:
// 定义图片文件解析,下面的 *
代表的是要上传的图片的格式,比如:png、jpg、JPEG等等
MediaType MEDIA_TYPE_PNG =
MediaType.parse('image/*');
MultipartBody multipartBody = new
MultipartBody.Builder()
.setType(MultipartBody.FORM)
//
这里设置要传给后台的参数;如果要添加多个参数,可以先获取到MultipartBody.Builder对象,然后再for循环添加
.addFormDataPart('orderId',
orderId)
// 约定key 如 'certificate'
作为后台接受图片的key;这里约定的key是:certificate
.addFormDataPart(CERTIFICATE,
file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file))
.build();
//构建Request请求体
Request.Builder RequestBuilder = new
Request.Builder();
Request request = RequestBuilder
// 添加URL地址
.url(requestURL)
.post(multipartBody)
.build();
// 构建 OkHttpClient 请求对象,后面大家都很熟悉了,不多说
OkHttpClient mOkHttpClient = new
OkHttpClient.Builder()
.connectTimeout(30 * 1000,
TimeUnit.MILLISECONDS)
.readTimeout(30 * 1000,
TimeUnit.MILLISECONDS)
.build();
mOkHttpClient.newCall(request).enqueue(new
Callback() {
@Override
public void
onFailure(Call call, IOException e) {
Log.e('TAGTAG', 'onFailure,图片上传失败:' +
e.getMessage());
}
@Override
public void
onResponse(Call call, Response response) throws IOException {
String str =
response.body().string();
Log.e('TAGTAG', 'onResponse,图片上传成功:' +
str);
}
});
二、将图片转换成Base64字符串上传
这个方案其实就跟我们通常的访问接口差不多,客户端将图片先转换为Base64字符串,然后将这个Base64字符串当做普通的文本传给后台,后台再将Base64字符串还原成图片即可:
//
把filePath地址对应的图片转换成Bitmap,然后再将bitmap转换成Base64字符串String
public static String bitmapToString(String
filePath) {
Bitmap bm =
getSmallBitmap(filePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//
1.5M的压缩后在100Kb以内,测试得值,压缩后的大小=94486字节,压缩后的大小=74473字节
// 这里的JPEG
如果换成PNG,那么压缩的就有600kB这样.
//
实际项目中,可以根据需要考虑图片压缩以及压缩的质量。
bm.compress(Bitmap.CompressFormat.JPEG, 40, baos);
byte[] b =
baos.toByteArray();
//
在这里获取到图片转换后的字符串,然后就可以将这个字符串当做普通的String字符串参数传给后台
//
如果有很多张图片要上传,那么可以考虑将转换后的Base64字符串添加到一个List里面,一并传给后台。
return
Base64.encodeToString(b, Base64.DEFAULT);
}
// 根据路径获得图片并压缩,返回bitmap用于显示
public static Bitmap getSmallBitmap(String
filePath) {
final
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = calculateInSampleSize(options, 480,
800);
options.inJustDecodeBounds = false;
return
BitmapFactory.decodeFile(filePath, options);
}
//计算图片的缩放质量
public static int
calculateInSampleSize(BitmapFactory.Options options,int reqWidth,
int reqHeight) {
final int
height = options.outHeight;
final int
width = options.outWidth;
int
inSampleSize = 1;
if (height
> reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float)
height/ (float) reqHeight);
final int widthRatio = Math.round((float)
width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio
? heightRatio : widthRatio;
}
return
inSampleSize;
}
————————————————
版权声明:本文为CSDN博主「任缥缈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/haoyuegongzi/article/details/120903881