Redis 儲存圖片 [base64/url/path]vs[object]

來源:互聯網
上載者:User

標籤:解碼   img   cti   pat   還原序列化   一段   encode   warning   world   

一、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中來儲存圖片:
  

  1. 圖片轉化成String字串
    (1)我們能夠在Redis儲存圖片的base64編碼或者解碼。以KV格式,K為一般字元串,V為圖片的base64編碼。get(K)後再base64解碼就能夠了;
    (2)我們也能夠在Redis中儲存圖片的網路url或者本地的path路徑,詳細實現能夠使圖片本身儲存到磁碟中,然後在Redis中以圖片的網路url或者本地的path路徑為value(V)值儲存。
  2. 圖片轉化成object對象
    直接在Redis中儲存圖片對象。使用Java的序列化/還原序列化機制進行處理實現。

Redis 儲存圖片 [base64/url/path]vs[object]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.