加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Android图片上传的两种方式

(2023-06-20 12:56:33)
分类: androidios
图片上传,以及带参数的图片上传是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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有