Android图片上传的两种方式
图片上传,以及带参数的图片上传是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() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("TAGTAG", "onFailure,图片上传失败:" + e.getMessage());}@Overridepublic 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;
}
Android图片上传的两种方式相关推荐
- 图片上传的两种方式(前端和后端)
1:前端 HTML: <html> <script type="text/javascript" src="js/jquery-3.1.1.min.js ...
- 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式
大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...
- web自动化测试图片上传的两种方法
web自动化测试图片上传的两种方法: 通过input标签的,如: <!DOCTYPE html> <html lang="en"> <head> ...
- vue获取上传图片的名字和路径_使用Vue实现图片上传的三种方式
项目中需要上传图片可谓是经常遇到的需求,本文将介绍 3 种不同的图片上传方式,在这总结分享一下,有什么建议或者意见,请大家踊跃提出来. 没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务 ...
- Android 文件上传的几种方式
这两天和新来的同事做一个项目,用到了文件上传,在这里记录下历程 Android文件上传有各种各样的Http框架,我也就简单说说我常用的吧,LiteHttp,OkHttp的封装还没做完全,有时间会补上, ...
- iOS:图片上传时两种图片压缩方式的比较
上传图片不全面的想法:把图片保存到本地,然后把图片的路径上传到服务器,最后又由服务器把路径返回,这种方式不具有扩展性,如果用户换了手机,那么新手机的沙盒中就没有服务器返回的图片路径了,此时就无法获取之 ...
- python实现selenium文件上传的两种方式
方法一.input标签上传 如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情 ...
- android打开另外的app两种方式,内置到自己本身的app,重新打开app,
android打开另外的app两种方式,内置到自己本身的app空间,重新打开app空间, 目录 1.内置到自己本身的app空间, 2.重新打开app空间, 1.内置到自己本身的app空间, 被打开的a ...
- JavaBean实现多个文件上传的两种方法
JavaBean实现多个文件上传的两种方法 王新芳 刘杰 北京工商大学计算机学院 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先 ...
最新文章
- OpenCV【零】—————cv::Mat——Mat对象创建方法
- c# 多线程排队队列实现的源码
- OpenCASCADE:读取和写入 IGES
- 养蛙游戏刷爆朋友圈,养蛙成功“反杀”传统手游?
- Spring学习笔记1
- 《成语玩命猜》两个弓
- IAR环境中实现数据或函数的定位
- 数据结构之链式队列的优化
- python中求众数_Python实现求众数的三种方法
- quarz设置定时器任务的有效时间段_Quartz动态指定定时时间,每秒钟执行一次
- Mac系统添加MySQL配置文件
- ISO14229-1道路车辆-统一诊断服务(UDS)-1
- 费尔防火墙源代码阅读
- Excel没有密码怎么打开
- 数据结构PTA习题:07-图4 哈利·波特的考试 (25分)
- buuctf misc 小易的U盘
- 一次 ASAN 找不到 symbolizer 问题的分析与解决
- 移动app测试经验分享
- pandas——描述性统计方法和时间类型
- Word标题编号变黑框