(Java) 解决使用 base64编码 保存到本地的图片出现破损的问题。 另:将base64编码图片上传至本地/OSS。
上周使用 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。相关推荐
- webuploader结合php实现图片上传到本地和保存数据库
webuploader结合php实现图片上传到本地和保存数据库,核心功能是以下三点: 一.上传前图片预览 二.上传图片到本地文件夹 三.上传图片路径和图片对应的设备编号到mysql数据库 Webupl ...
- java实现图片上传至本地
在工作中要求将图片上传至本地,如下代码将介绍如何将图片上传至本地 准备工作: 环境:eclipse4.5-x64,jdk1.7-x64,maven3 tomcat服务器配置图片上传映射: 上传至本地服 ...
- 微信公众号调用手机相册并将图片上传到本地服务器
最近有一个需求,用公众号调用本地相册,并将图片上传到本地服务器(不是微信服务器). 步骤一:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq ...
- JavaScript 实现图片上传前本地预览
JavaScript 实现图片上传前本地预览 图片上传前预览,应该算是一个普遍的需求,很多时候可能选中的图片并不是想要的那张,所以需要上传前预览下. JS(浏览器中)是一门特殊的语言,它没有直接读写磁 ...
- SSM框架-添加信息及图片上传到本地MultipartResolver-foreknow_cms
MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isM ...
- 记录ueditor 秀米图片上传到本地错误
1.在config.json里面配置你的图片服务器地址 不添加会发送一个这样的请求,action='' undefine[]=图片地址. 2.编写秀米图片本地化上传方法 uploadUrlFile 是 ...
- jQuery图片上传前先在本地预览(不经过后端处理)
前段时间遇到一个问题,前端想实现图片上传预览(不经过后端PHP或JAVA处理),用户点击file按钮上传文件,点击确定马上就能看到预览的效果,但在实现的时候无论怎样都取不到file上图片的真实路径,得 ...
- gtp java 文件传输_5_1_图片上传
图片上传 一 需求 1 图片上传到本地: 2 图片上传到七牛云. 效果图: 二 具体代码实现 1 ToutiaoUtil.java: 用来判断上传的文件名是否合格: packagecom.nowcod ...
- java 图片上传 并保存服务器本地 后台 代码
java 图片上传后台代码,把图片保存到服务器本地盘,并且按照一天一个文件夹分开存放,易于管理,不说了直接上代码: @Controller @RequestMapping("/oa" ...
最新文章
- 吉林大学计算机维护与维修,吉林大学汽车维修工程考试知识点.doc
- 设计模式总结: 5种创建型,7种结构型,11种行为型
- CentOS7安装wdCP面板,快速搭建web运行环境(图文详解)
- pt-archiver 数据归档bug
- 1.9 编程基础之顺序查找 03 不高兴的津津 scratch
- codeforces 679A Bear and Prime 100 交互
- 【CCCC】L2-001 紧急救援 (25分),,Dijkstra标准模板(多路径,最大点权和路径打印)
- Julia: 使用Flux实现手写数字识别
- XML 文档四种解析放式
- Java中实体类名称后缀VO,DTO的含义
- 地铁综合监控系统网络方案,简化工作轻松应对客流高峰
- 微信/钉钉电脑端登录后手机端不再提醒
- 关于FBB-FFD算法加速因子的证明
- 外设驱动步骤和K66SDK库与龙邱库TPM模块整合过程
- HDwiki+discuz在启用https下的整合问题
- cs231n---RNN、图像字幕、注意力机制Attention、梯度消失、爆炸、LSTM
- shell for循环命令行_七年老运维实战中的 Shell 开发经验总结
- 新浪微博视频批量上传社区投稿工具教程
- 中国的教育缺少什么?
- 《共享经济》创业沙龙
热门文章
- JavaScript:简单实现弹出窗口div
- App测试经验分享之登录注册
- 关于win10电脑下,HP网络打印机已连接不打印,需要用户干预,或者用户注意等处理方案
- javascript中如何创建数组-与创建数组的几种方法
- 如何让自己每天都过得很充实很开心--论制定计划目标的重要性
- macbook安装矢量图编辑Illustrator 2022(AI2022)
- Laravel 任务调度
- leetcode171. Excel表列序号
- MacOS Ventura 13.0 如何开启键盘灯
- xp计算机经典登录,泪奔回忆 windows XP里的100个传奇经典