上周使用 base64 上传图片到OSS中的时候,发现保存的图片出现显示马赛克和图片破损打不开的情况。找了很久也没有出现问题,今天在找答案的时候,偶然间发现有个博主分享的内容完美的解决了我的问题(这里特别感谢这位博主的分享),所以特此记录一下,希望能够帮助遇到同样问题却又苦苦挣扎的朋友们。

关于 base64编码 保存的图片无法正常显示的问题,需要注意两点:

1)上传使用的 base64编码 只需要 “data:image/png;base64,”(这个是指图片的格式,也有可能是“data:image/jpeg;base64,”等)之后的字符串,所以一定要去掉这个前缀。

备注:截取的时候可以使用 base64字符串.substring(base64字符串.indexOf(",") + 1) 方法;

2)如果第一点已经确认写的没问题,但是图片仍然显示有问题(我就是这个问题),那么可以继续往下看:

Postman/Ajax (我是使用Postman的时候出现的问题) 在传 base64编码 的时候,会把 base64编码 中的 "+" 号换成空格,所以需要先将base64中的空格转换回来,再进行保存操作!

下面是使用 base64编码 上传的工具类:

public static String getBase64ToImg(String userPhoto,String userId){Date date = new Date();SimpleDateFormat sft = new SimpleDateFormat("yyyy-MM-dd");String newUserPhoto = null;// 判断base64编码是否为空if(StringUtils.notNull(userPhoto)){    // base64编码不为空// 1)截取获取到的base64编码,去掉前缀"data:image/png;base64," || "data:image/jpeg;base64,",只取base64编码// 2)需要将 base64编码 中的空格转换成 + 号userPhoto = userPhoto.substring(userPhoto.indexOf(",") + 1).replaceAll(" ", "+");try {newUserPhoto = "images/" + sft.format(date).toString() + "/" + userId + ".png"; //Base64解码BASE64Decoder decoder = new BASE64Decoder();byte[] photoBase64 = decoder.decodeBuffer(userPhoto);for(int i=0;i<photoBase64.length;++i){if(photoBase64[i]<0){//调整异常数据photoBase64[i]+=256;}}/* 保存到本地 如果要保存到OSS中,这个块可以不用写 begin*/// 创建当前日期的文件件File file = new File("images/" + sft.format(date).toString() + "/");file.mkdirs();newUserPhoto = "images/" + sft.format(date).toString() + "/" + userId +".png"; //新生成的图片OutputStream out = new FileOutputStream(newUserPhoto);out.write(photoBase64);out.flush();out.close();/* 保存到本地 end*//* 上传至OSS 如果需要将图片上传至OSS,只需要在 Base64解码 之后,直接调用OSS的SDK即可,不需要再保存到本地  begin*/// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = "http://oss-cn-beijing.aliyuncs.com";// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。String accessKeyId = "xxxxxxx";String accessKeySecret = "xxxxxxxx";String bucketName = "images";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);// 上传Byte数组。ossClient.putObject(bucketName, newUserPhoto, new ByteArrayInputStream(photoBase64));// 关闭OSSClient。ossClient.shutdown();/* 上传至OSS 如果需要将图片上传至OSS,只需要在 Base64解码 之后,直接调用OSS的SDK即可,不需要再保存到本地  end*/} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}return newUserPhoto;}

(Java) 解决使用 base64编码 保存到本地的图片出现破损的问题。 另:将base64编码图片上传至本地/OSS。相关推荐

  1. webuploader结合php实现图片上传到本地和保存数据库

    webuploader结合php实现图片上传到本地和保存数据库,核心功能是以下三点: 一.上传前图片预览 二.上传图片到本地文件夹 三.上传图片路径和图片对应的设备编号到mysql数据库 Webupl ...

  2. java实现图片上传至本地

    在工作中要求将图片上传至本地,如下代码将介绍如何将图片上传至本地 准备工作: 环境:eclipse4.5-x64,jdk1.7-x64,maven3 tomcat服务器配置图片上传映射: 上传至本地服 ...

  3. 微信公众号调用手机相册并将图片上传到本地服务器

    最近有一个需求,用公众号调用本地相册,并将图片上传到本地服务器(不是微信服务器). 步骤一:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq ...

  4. JavaScript 实现图片上传前本地预览

    JavaScript 实现图片上传前本地预览 图片上传前预览,应该算是一个普遍的需求,很多时候可能选中的图片并不是想要的那张,所以需要上传前预览下. JS(浏览器中)是一门特殊的语言,它没有直接读写磁 ...

  5. SSM框架-添加信息及图片上传到本地MultipartResolver-foreknow_cms

    MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isM ...

  6. 记录ueditor 秀米图片上传到本地错误

    1.在config.json里面配置你的图片服务器地址 不添加会发送一个这样的请求,action='' undefine[]=图片地址. 2.编写秀米图片本地化上传方法 uploadUrlFile 是 ...

  7. jQuery图片上传前先在本地预览(不经过后端处理)

    前段时间遇到一个问题,前端想实现图片上传预览(不经过后端PHP或JAVA处理),用户点击file按钮上传文件,点击确定马上就能看到预览的效果,但在实现的时候无论怎样都取不到file上图片的真实路径,得 ...

  8. gtp java 文件传输_5_1_图片上传

    图片上传 一 需求 1 图片上传到本地: 2 图片上传到七牛云. 效果图: 二 具体代码实现 1 ToutiaoUtil.java: 用来判断上传的文件名是否合格: packagecom.nowcod ...

  9. java 图片上传 并保存服务器本地 后台 代码

    java 图片上传后台代码,把图片保存到服务器本地盘,并且按照一天一个文件夹分开存放,易于管理,不说了直接上代码: @Controller @RequestMapping("/oa" ...

最新文章

  1. 吉林大学计算机维护与维修,吉林大学汽车维修工程考试知识点.doc
  2. 设计模式总结: 5种创建型,7种结构型,11种行为型
  3. CentOS7安装wdCP面板,快速搭建web运行环境(图文详解)
  4. pt-archiver 数据归档bug
  5. 1.9 编程基础之顺序查找 03 不高兴的津津 scratch
  6. codeforces 679A Bear and Prime 100 交互
  7. 【CCCC】L2-001 紧急救援 (25分),,Dijkstra标准模板(多路径,最大点权和路径打印)
  8. Julia: 使用Flux实现手写数字识别
  9. XML 文档四种解析放式
  10. Java中实体类名称后缀VO,DTO的含义
  11. 地铁综合监控系统网络方案,简化工作轻松应对客流高峰
  12. 微信/钉钉电脑端登录后手机端不再提醒
  13. 关于FBB-FFD算法加速因子的证明
  14. 外设驱动步骤和K66SDK库与龙邱库TPM模块整合过程
  15. HDwiki+discuz在启用https下的整合问题
  16. cs231n---RNN、图像字幕、注意力机制Attention、梯度消失、爆炸、LSTM
  17. shell for循环命令行_七年老运维实战中的 Shell 开发经验总结
  18. 新浪微博视频批量上传社区投稿工具教程
  19. 中国的教育缺少什么?
  20. 《共享经济》创业沙龙

热门文章

  1. JavaScript:简单实现弹出窗口div
  2. App测试经验分享之登录注册
  3. 关于win10电脑下,HP网络打印机已连接不打印,需要用户干预,或者用户注意等处理方案
  4. javascript中如何创建数组-与创建数组的几种方法
  5. 如何让自己每天都过得很充实很开心--论制定计划目标的重要性
  6. macbook安装矢量图编辑Illustrator 2022(AI2022)
  7. Laravel 任务调度
  8. leetcode171. Excel表列序号
  9. MacOS Ventura 13.0 如何开启键盘灯
  10. xp计算机经典登录,泪奔回忆 windows XP里的100个传奇经典