安卓图片上传实现

陆赞赞 / 2023-08-07 / 原文

安卓的图片上传是一个非常常见的功能,我是这么实现的:通过bitmap转成base64字符串,传递base64字符串到后端接口,后端接口解码后保存在服务器上

安卓端:

private void uploadImage(Bitmap imgBitmap,String nameType) throws IOException {//上传图片到服务器,传入图片bitmap,编码

ByteArrayOutputStream stream = new ByteArrayOutputStream();
imgBitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream);
byte[] byteArray = stream.toByteArray();
String encodedImage = Base64.encodeToString(byteArray, Base64.NO_WRAP);

map.clear();
map.put("photo", encodedImage);
map.put("nameType",nameType);

sendRequestThread=new SendRequestThread(UrlUtil.PDA_UPIMAGE,POST_TPUP,
ActionCodeUtil.UPLOADFAIL,handler,
map,new TypeToken<String>(){}.getType());
sendRequestThread.start();
}

服务端:

public static String base64ToJpg(String path,String base64,String nameType){//解码后保存在服务器上并返回图片地址
// 判断文件路径是否存在
File filePath = new File(path);
if (!filePath.exists()){
filePath.mkdirs();
}
// 创建文件
String jpgFile = path + "\\" + nameType + UUID.randomUUID() + ".jpeg";
File file = new File(jpgFile);
boolean jpgFileExist = false;
try {
jpgFileExist = file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (jpgFileExist){

base64 = base64.replaceAll(" ", "+");
// 解密
Base64.Decoder decoder = Base64.getDecoder();
// 去掉base64前缀 data:image/jpeg;base64,
//base64 = base64.substring(base64.indexOf(",", 1) + 1, base64.length());
byte[] b = decoder.decode(base64);
// 处理数据
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {
b[i] += 256;
}
}

// 保存图片
try {
FileOutputStream out = new FileOutputStream(jpgFile);
out.write(b);
out.flush();
out.close();
// 写入成功返回文件路径
System.out.println(jpgFile);
return jpgFile;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "error";
}