图片上传,以及带参数的图片上传是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. 图片上传的两种方式(前端和后端)

    1:前端 HTML: <html> <script type="text/javascript" src="js/jquery-3.1.1.min.js ...

  2. 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式

    大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...

  3. web自动化测试图片上传的两种方法

    web自动化测试图片上传的两种方法: 通过input标签的,如: <!DOCTYPE html> <html lang="en"> <head> ...

  4. vue获取上传图片的名字和路径_使用Vue实现图片上传的三种方式

    项目中需要上传图片可谓是经常遇到的需求,本文将介绍 3 种不同的图片上传方式,在这总结分享一下,有什么建议或者意见,请大家踊跃提出来. 没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务 ...

  5. Android 文件上传的几种方式

    这两天和新来的同事做一个项目,用到了文件上传,在这里记录下历程 Android文件上传有各种各样的Http框架,我也就简单说说我常用的吧,LiteHttp,OkHttp的封装还没做完全,有时间会补上, ...

  6. iOS:图片上传时两种图片压缩方式的比较

    上传图片不全面的想法:把图片保存到本地,然后把图片的路径上传到服务器,最后又由服务器把路径返回,这种方式不具有扩展性,如果用户换了手机,那么新手机的沙盒中就没有服务器返回的图片路径了,此时就无法获取之 ...

  7. python实现selenium文件上传的两种方式

    方法一.input标签上传     如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情 ...

  8. android打开另外的app两种方式,内置到自己本身的app,重新打开app,

    android打开另外的app两种方式,内置到自己本身的app空间,重新打开app空间, 目录 1.内置到自己本身的app空间, 2.重新打开app空间, 1.内置到自己本身的app空间, 被打开的a ...

  9. JavaBean实现多个文件上传的两种方法

    JavaBean实现多个文件上传的两种方法 王新芳        刘杰 北京工商大学计算机学院 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先 ...

最新文章

  1. OpenCV【零】—————cv::Mat——Mat对象创建方法
  2. c# 多线程排队队列实现的源码
  3. OpenCASCADE:读取和写入 IGES
  4. 养蛙游戏刷爆朋友圈,养蛙成功“反杀”传统手游?
  5. Spring学习笔记1
  6. 《成语玩命猜》两个弓
  7. IAR环境中实现数据或函数的定位
  8. 数据结构之链式队列的优化
  9. python中求众数_Python实现求众数的三种方法
  10. quarz设置定时器任务的有效时间段_Quartz动态指定定时时间,每秒钟执行一次
  11. Mac系统添加MySQL配置文件
  12. ISO14229-1道路车辆-统一诊断服务(UDS)-1
  13. 费尔防火墙源代码阅读
  14. Excel没有密码怎么打开
  15. 数据结构PTA习题:07-图4 哈利·波特的考试 (25分)
  16. buuctf misc 小易的U盘
  17. 一次 ASAN 找不到 symbolizer 问题的分析与解决
  18. 移动app测试经验分享
  19. pandas——描述性统计方法和时间类型
  20. Word标题编号变黑框

热门文章

  1. 设计模式—策略模式(Strategy Pattern)
  2. onu光功率多少是正常_光猫的收发光功率正常范围是多少
  3. C语言 吃鱼还是吃肉
  4. MPC (c++) 和 udacity模拟器仿真
  5. 邮箱授权码正确,却连接失败
  6. vue判断当前浏览器为IE低版本,给出升级提示;IE11及其他浏览器正常使用
  7. 用IMAP4访问Exchange邮箱
  8. php fpm工作原理,phpfpm工作原理是什么?
  9. 游戏设计模式阅读笔记18——优化模式(对象池模式)
  10. 移动联通电信老用户如何转腾讯大王卡、蚂蚁宝卡、鱼卡等技巧