Android 从相机相册获取图片 使用OkHttpClient 上传至服务器

这篇博客介绍了如何在Android应用中从相机相册选择图片,然后使用OkHttp库进行图片压缩和上传至服务器的过程。主要步骤包括导入OkHttp依赖,获取Bitmap对象,图片等比例压缩,转换为String,以及调用上传方法。

这是本人接手被人的项目(mvp搭的细碎),所以 为了更快速的开发,代码很不规范 望周知,望见谅.

 

这个需求呢,是 从相机相册获取图片上传至服务器 相机相册在这里就不写了 望见谅.

 

上步骤 上代码

 

1.第一步导入Ok的依赖库

implementation 'com.squareup.okhttp3:okhttp:3.2.0'

 

2.相机相册代码略过

 

3.从Intent data里利用Api获取Bitmap对象

 Bitmap bitmap = data.getParcelableExtra("data");

 

4.对图片进行等比例压缩(因为图片上传至服务器会有大小的限制 知不道你们的有没有)

 

//对图片进行等比例压缩
Bitmap newBitmap = CompressImageUtils.pressScaleCompress(bitmap);

5.图片压缩的Utils(cv就好)

 

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;

import java.io.ByteArrayOutputStream;

public class CompressImageUtils {

    //pressScaleCompress
    //按比例压缩
    public static Bitmap pressScaleCompress(Bitmap bitmap) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();  //创建一个字节数组输出流对象
        bitmap.compress(Bitmap.CompressFormat.PNG, 80, os); //通过bitmap中的compress,将图片压缩到os流对象中.
        //其中第二个参数quality,为100表示不压缩,如果为80,表示压缩百分之20.
        byte[] bt = os.toByteArray(); //将流对象转行成数组
        Bitmap bitmap1 = BitmapFactory.decodeByteArray(bt, 0, bt.length); //将字节数组转换成bitmap图片

        return bitmap1;
    }

    public static Bitmap pressScaleWidthHeightCompress(Bitmap bitmap) {
        Matrix matrix = new Matrix();
        matrix.postScale(0.6f, 0.6f);  //matrix 设置为0.6f 就是对宽高缩放二分之一
        Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

        return bitmap1;
    }

}

 

6.把Bitmap对象转换成String(cv)

 

//把bitmap对象转换为String
path1 = FileUtilcll.saveFile(this, "pic1.jpg", newBitmap);

 

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Environment;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class FileUtilcll {

    /**
     * 将Bitmap 图片保存到本地路径,并返回路径
     * @param fileName 文件名称
     * @param bitmap   图片
     * @param资源类型,参照 MultimediaContentType 枚举,根据此类型,保存时可自动归类
     */
    public static String saveFile(Context c, String fileName, Bitmap bitmap) {
        return saveFile(c, "", fileName, bitmap);
    }

    public static String saveFile(Context c, String filePath, String fileName, Bitmap bitmap) {
        byte[] bytes = bitmapToBytes(bitmap);
        return saveFile(c, filePath, fileName, bytes);
    }

    public static byte[] bitmapToBytes(Bitmap bm) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(CompressFormat.JPEG, 100, baos);
        return baos.toByteArray();
    }

    public static String saveFile(Context c, String filePath, String fileName, byte[] bytes) {
        String fileFullName = "";
        FileOutputStream fos = null;
        String dateFolder = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA)
                .format(new Date());
        try {
            String suffix = "";
            if (filePath == null || filePath.trim().length() == 0) {
                filePath = Environment.getExternalStorageDirectory() + "/XiaoCao/" + dateFolder + "/";
            }
            File file = new File(filePath);
            if (!file.exists()) {
                file.mkdirs();
            }
            File fullFile = new File(filePath, fileName + suffix);
            fileFullName = fullFile.getPath();
            fos = new FileOutputStream(new File(filePath, fileName + suffix));
            fos.write(bytes);
        } catch (Exception e) {
            fileFullName = "";
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    fileFullName = "";
                }
            }
        }
        return fileFullName;
    }
}

7.把图片的绝对路径 放到File对象中 用于上传前的准备

 

new Thread(new Runnable() {
    @Override
    public void run() {

        File file = new File(path1);

        upImage(file);

    }
}).start();

 

8.做好了 准备工作 开始调用方法上传图片

 

private void upImage(File fileName) {

    OkHttpClient client = new OkHttpClient();
    // form 表单形式上传
    MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);
    if (fileName != null) {
        // MediaType.parse() 里面是上传的文件类型。
        RequestBody body = RequestBody.create(MediaType.parse("image/*"), fileName);
        String filename = fileName.getName();
        // 参数分别为, 请求key ,文件名称 , RequestBody
        requestBody.addFormDataPart("图片的参数名", filename, body).addFormDataPart("第二个参数名", "没有可以删掉");
    }

    Request request = new Request.Builder()
            .url(https://blog.csdn.net/"url")
            .post(requestBody.build()).build();
    // readTimeout("请求超时时间" , 时间单位);
    client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build().newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            try {
                if (response != null && response.isSuccessful()) {
                    final String json = response.body().string();
 }

        }
    });

}

到这里图片上传就完成了 是不是很简单呢

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值