实现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 Map
setMemberImage(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测试

访问我们的url地址

成功,前端img标签访问我们对外提供的映射地址即可

上一篇:Nginx配置HTTPS
下一篇:第一个Shell Script 程序

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年03月29日 12时32分23秒