这是本人接手被人的项目(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();
}
}
});
}
到这里图片上传就完成了 是不是很简单呢
这篇博客介绍了如何在Android应用中从相机相册选择图片,然后使用OkHttp库进行图片压缩和上传至服务器的过程。主要步骤包括导入OkHttp依赖,获取Bitmap对象,图片等比例压缩,转换为String,以及调用上传方法。
2607

被折叠的 条评论
为什么被折叠?



