安卓图片上传实现
安卓的图片上传是一个非常常见的功能,我是这么实现的:通过bitmap转成base64字符串,传递base64字符串到后端接口,后端接口解码后保存在服务器上
安卓端:
private void uploadImage(Bitmap imgBitmap,String nameType) throws IOException {//上传图片到服务器,传入图片bitmap,编码
ByteArrayOutputStream stream = new ByteArrayOutputStream();
imgBitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream);//这个函数进行图片的压缩,90是图片的压缩比例
byte[] byteArray = stream.toByteArray();
String encodedImage = Base64.encodeToString(byteArray, Base64.NO_WRAP);//注意,如果需要传到后台,这里一定要使用Base64.NO_WRAP,不然编码时会有\n进行换行,后端接受base64字符串的时候就不好解码了
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需要将 空格 替换成 + (因为 + 在前后端传值的时候会被解析成 空格 ,解码出来就会失败)
// 解密
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";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律