redis java 存储图片_Redis 存储图片 [base64/url/path]vs[object]
一、base64图片编解码
基本流程:从网络获取下载一张图片。然后base64编码,再base64解码,存到本地E盘根文件夹下。
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
@SuppressWarnings("restriction")
public class Base64ImageUtils {
/**
* 将网络图片进行Base64位编码
*
*@param imageUrl
* 图片的url路径,如http://.....xx.jpg
*@return
*/
public static String encodeImgageToBase64(URL imageUrl) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
ByteArrayOutputStream outputStream = null;
try {
BufferedImage bufferedImage = ImageIO.read(imageUrl);
outputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", outputStream);
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(outputStream.toByteArray());// 返回Base64编码过的字节数组字符串
}
/**
* 将本地图片进行Base64位编码
*
*@param imageFile
* 图片的url路径,如F:/.....xx.jpg
*@return
*/
public static String encodeImgageToBase64(File imageFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
ByteArrayOutputStream outputStream = null;
try {
BufferedImage bufferedImage = ImageIO.read(imageFile);
outputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", outputStream);
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(outputStream.toByteArray());// 返回Base64编码过的字节数组字符串
}
/**
* 将Base64位编码的图片进行解码,并保存到指定文件夹
*
*@param base64
* base64编码的图片信息
*@return
*/
public static void decodeBase64ToImage(String base64, String path,
String imgName) {
BASE64Decoder decoder = new BASE64Decoder();
try {
FileOutputStream write = new FileOutputStream(new File(path
+ imgName));
byte[] decoderBytes = decoder.decodeBuffer(base64);
write.write(decoderBytes);
write.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String [] args){
URL url = null;
try {
url = new URL("http://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/9.jpg");
} catch (MalformedURLException e) {
e.printStackTrace();
}
String encoderStr = Base64ImageUtils.encodeImgageToBase64(url);
System.out.println(encoderStr);
Base64ImageUtils.decodeBase64ToImage(encoderStr, "E:/", "football.jpg");
}
}
控制台输出的base64编码后的结果:
查看E盘根文件夹:
二、Redis对象object存储
Redis存储对象数据的时候。要进行对象的序列化与反序列化操作。
package RedisObject;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
public Person() {
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package RedisObject;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeUtil {
/**
* 序列化
*
*@param object
*@return
*/
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
}
return null;
}
/**
* 反序列化
*
*@param bytes
*@return
*/
public static Object unserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
}
return null;
}
}
package RedisObject;
import redis.clients.jedis.Jedis;
public class PersonRedisTest {
private static Jedis jedis = null;
/**
* 初始化Jedis对象
*
*@throws Exception
*/
public PersonRedisTest() {
jedis = new Jedis("127.0.0.1", 6379);
}
/**
* 序列化写对象, 将Person对象写入Redis中
*
*/
public void setObject() {
jedis.set("person:100".getBytes(),
SerializeUtil.serialize(new Person(100, "zhangsan")));
jedis.set("person:101".getBytes(),
SerializeUtil.serialize(new Person(101, "bruce")));
}
/**
* 反序列化取对象, 用Jedis获取对象
*
*/
public void getObject() {
byte[] data100 = jedis.get(("person:100").getBytes());
Person person100 = (Person) SerializeUtil.unserialize(data100);
System.out.println(String.format("person:100->id=%s,name=%s",
person100.getId(), person100.getName()));
byte[] data101 = jedis.get(("person:101").getBytes());
Person person101 = (Person) SerializeUtil.unserialize(data101);
System.out.println(String.format("person:101->id=%s,name=%s",
person101.getId(), person101.getName()));
}
public static void main(String[] args) {
PersonRedisTest rt = new PersonRedisTest();
rt.setObject();
rt.getObject();
}
}
执行main函数结果:
查看Redis存储的数据:
三、Redis存储图片
在《Redis入门指南》一书的P22(第22页)中,有这么一段话:
“字符串类型是Redis中最主要的数据类型,它能存储不论什么形式的字符串,包含二进制数据。你能够用其存储用户的邮箱、JSON化的对象甚至是一张图片。”
Redis 是一个数据结构类型的server。不是单纯的 key-value 存储。 Redis 里面的键是二进制安全的(二进制安全是指数据在传输过程中保证数据的安全性,包含加密等),因此键的内容不应该包含空格或者换行符。比方 ”hello world” 和 ”hello world\n” 是错误的。
那么怎么在Redis中存储图片呢?说白了。图片就是一组二进制数据,直接存储二进制数据肯定是不行的,要实现Redis存储二进制数据,那么就得事先实行转化。
在一、二中已经写了图片base64编解码和redis存储对象的过程。那么我们就能够这样子在Redis中来存储图片:
图片转化成String字符串
(1)我们能够在Redis存储图片的base64编码或者解码。以KV格式,K为普通字符串,V为图片的base64编码。get(K)后再base64解码就能够了;
(2)我们也能够在Redis中存储图片的网络url或者本地的path路径,详细实现能够使图片本身存储到磁盘中,然后在Redis中以图片的网络url或者本地的path路径为value(V)值存储。
图片转化成object对象
直接在Redis中存储图片对象。使用Java的序列化/反序列化机制进行处理实现。
redis java 存储图片_Redis 存储图片 [base64/url/path]vs[object]相关推荐
- redis映射的概念_Redis存储总是心里没底?你大概漏了这些数据结构原理
原标题:Redis存储总是心里没底?你大概漏了这些数据结构原理 上一篇文章<Redis存储总用String?你大概错过了更优的使用方法>我们了解了Redis的数据类型特点与适用场景,本期内 ...
- redis java 集成视频_redis(6)-java集成二
使用Jedis框架: 创建maven工程,引入依赖 redis.clients jedis 2.9.0 Demo代码如下: import java.util.HashMap; import java. ...
- redis java连接出错_redis连接错误与spring boot
我使用spring boot框架来连接redis,我得到了错误 Caused by: java.lang.NoSuchMethodError: redis.clients.jedis.JedisSha ...
- redis java 发布订阅_Redis之发布订阅(Java)
上一章节我们已经学会了Redis在Java项目里面最基本的应用,我们这一章节来讲一讲Redis里面一个非常重要的功能:发布订阅 发布订阅(Pub/Sub):目前广泛使用的通信模型,它采用事件作为基本的 ...
- java以Blob形式存储,读取图片并在jsp页面显示图片流
2019独角兽企业重金招聘Python工程师标准>>> 废话少说代码伺候: 封装好的ImageUtil类:目的读取本地的图片文件并存入数据库,然后读出数据库中以Blob形式存储的图片 ...
- java实现图片文件存储到数据库
参见:http://www.cnblogs.com/kakag/p/3145140.html 1.数据表: create table tb_file(-> fid SMALLINT AUTO_I ...
- 架构设计:系统存储(20)——图片服务器:需求和技术选型(2)
(接上文<架构设计:系统存储(19)--图片服务器:需求和技术选型(1)>) 3-5.其它技术选型说明 3-5-1.关于关系型数据库 关于持久化存储的数据库技术要注意一点,实际上它并不是图 ...
- 系统存储(19)——图片服务器:需求和技术选型
1.概述 图片服务系统是各种针对C端系统常见的子系统,它的特点是存储规模大请求频度高,且单张图片的读请求远远高于写请求.后续几篇文章我们将从图片服务系统的需求分析开始,一起来讨论如何进行这类系统的技术 ...
- .net 数据存储 mysql_asp.net实现存储和读取数据库图片
本文实例为大家分享了asp.net存储和读取数据库图片的具体代码,供大家参考,具体内容如下 1. 创建asp.net web窗体项目 代码如下: 上传图片 展示图片 效果图如下: 2. 创建数据库 数 ...
最新文章
- 输入字符串,包含数字,大小写字母,编程输出出现做多的数字的和
- docker 安装 RabbitMQ
- Linux(Ubuntu)下如何解压 .zip 文件
- Kafka压力测试(写入MQ消息压测和消费MQ消息压测)
- linux下面显示所有正在运行的线程
- 英语口语 week14 Friday
- unsigned long long 溢出 乘_Java整数相加溢出怎么办?Java8一步搞定
- 2008哲思自由软件峰会
- cortex a7 a53_西昊人体工学椅A7开箱测评
- 小企业如何才能做强做大?
- PreferenceActivity之 Subclasses of PreferenceActivity must override isValidFragment(String)
- 【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习
- 快递鸟接口国内常用快递公司编码表
- 中国台湾研发miniLED技术进展迅速,将给面板技术带来变革
- TVS瞬态抑制二极管选型指南
- 入门计算机的粗略学习-Day13
- VtigerCRM 点击拨号和来电弹屏 PBX Manager Module
- MySQL 高可用MMM
- 魔方二维动态还原过程MATLAB仿真/魔方二维平面展开
- 菜鸟入门:Java程序员学习之路
热门文章
- 我在 GitHub 上看到了一个丧心病狂的开源项目!治好了我的拖延症
- python3.5全局解释器锁GIL-实现原理浅析
- Django源码分析5:session会话中间件分析
- Scrapy_redis框架原理分析并实现断点续爬以及分布式爬虫
- python列表用法详解(查找、添加、删除、修改、复制、循环遍历、列表嵌套)
- 【网络协议】TCP分段与IP分片
- 一份火爆国外的PyCharm快捷键和Python代码速查表
- 用于手语识别的自注意力机制
- EasyTransaction 1.3.0 发布,一站式分布式事务解决方案
- 书值 | 第 2 期:成为技术管理者,思维上应该如何转变?