IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android图片上传的两种方式 -> 正文阅读

[移动开发]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() {
            @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;
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:37:23  更:2021-10-23 12:37:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:40:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码