
实现Base64转PNG图片存储在服务器,并通过 Nginx 映射服务器图片地址实现更换用户头像功能
这是我们要修改的头像
发布日期:2021-05-04 05:35:28
浏览次数:27
分类:精选文章
本文共 3332 字,大约阅读时间需要 11 分钟。
前端页面将图片转为png的Base64字符传输到后台,我们需要处理字符,将 base64 转为以 png 为文件扩展名的图片,用 Nginx 映射资源
这是我们的用户头像
下面是我的接口实现
@PostMapping("/v2/user/upimg")public Object upNewImage(@RequestBody JSONObject payLoad){ return memberService.setMemberImage(payLoad.getString("userToken"), payLoad.getString("img"),payLoad.getString("url"));}
下面使我们的业务实现
@Autowired EzblockMemberMapper ezblockMemberMapper; @Autowired redisService redis; public MapsetMemberImage(String userToken, String baseImage, String url) { try{ // 判断token是否有效 返回用户Id Integer id = ezblockMemberMapper.getUserIdByUserToken(userToken); if(id!=null && id > 0){ // 第一次修改图片,因此url为null 我们需要为用户保存头像路径信息 if (url == null || url ==""){ // Redis 实现唯一id Long imageId = redis.incr(MemberConstans.IMAGE_ID_KEY); // 文件名拼接,通过nginx映射,所以用该地址查找图片没问题 // 但 I/O 操作时,不能是该路径 String img = MemberConstans.IMG_PREFIX+imageId+".png"; // 修改数据库中用户的头像指向的值 Integer result = ezblockMemberMapper.updateImageById(id,img); if (result!=null&&result>0){ url = img; } } // 实现base64转图片并保存 if(ImageUtil.GenerateImage(MemberConstans.URL_PREFIX+url.substring(39),ImageUtil.replacePre(baseImage))) { return Result.Result(); } } return Result.errorResult("修改失败"); }catch (Exception e){ logger.error(e.getMessage()); return Result.errorResult("修改失败"); } }
保存图片 代码实现
/** * 将base64 图片进行保存 * @param baseImage * @return */ public static boolean GenerateImage(String url,String baseImage){ if (baseImage == null){ return false; } try{ byte[] b =decoder.decodeBuffer(baseImage); for (int i=0;i < b.length;i++){ if (b[i]<0){ b[i]+=256; } } String imgFilePath =url; OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); return true; }catch (Exception e){ e.printStackTrace(); return false; } } /** * 处理base64 前面的图片前缀 不处理图片不可用 * @param base base64字符 * @return */ public static String replacePre(String base){ String imgType = "jpg,png,jpeg"; if (!StringUtils.isEmpty(imgType)){ String [] typeArr = imgType.split(","); Pattern pattern; Matcher matcher; String regix; for (String v: typeArr) { regix = MessageFormat.format("data:image/{0};base64,", v); pattern = Pattern.compile(regix, Pattern.CASE_INSENSITIVE); matcher = pattern.matcher(base); if (matcher.lookingAt()) { return matcher.replaceFirst(""); } } } return base; }
Nginx配置
location /ezblock_img { alias /home/ezblock_img/; }
接下来我们,部署到服务器中,通过Postman测试
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月29日 12时32分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode 题解 | 1. 两数之和
2019-03-06
#2036:改革春风吹满地
2019-03-06
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
2019-03-06
P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
2019-03-06
按需取余
2019-03-06
算法学习笔记: 珂朵莉树
2019-03-06
算法学习笔记:母函数详解
2019-03-06
Codeforces Round #664 题解(A ~ C)
2019-03-06
Problem 1342B - Binary Period (思维)
2019-03-06
Problem A - Sequence with Digits (数学推导)
2019-03-06
Problem 330A - Cakeminator (思维)
2019-03-06
Codeforces Round #674 (Div. 3) (A - F题题解)
2019-03-06
「HDU-2196」Computer (树形DP、树的直径)
2019-03-06
Codeforces Global Round 11 个人题解(B题)
2019-03-06
LeetCode75 颜色分类 (三路快排C++实现与应用)
2019-03-06
GDB调试基础使用方法
2019-03-06
HHKB 键盘布局记录以及一些闲言碎语
2019-03-06
【译】N 皇后问题 – 构造法原理与证明 时间复杂度O(1)
2019-03-06