图片存储到cassandra数据库的方案

fmms 13年前
     <p><strong>1、创建一个测试的CF</strong></p>    <br />    <pre class="brush:sql; toolbar: true; auto-links: false;">create Column family ImagesFile with  comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type and column_metadata= [ {column_name: ImagesFileId , validation_class: UTF8Type,index_type: KEYS}, {column_name: FileName, validation_class: UTF8Type}, {column_name: FileByteDatas, validation_class: UTF8Type} ];</pre>    <strong>2、服务端代码如下:<pre class="brush:java; toolbar: true; auto-links: false;">package com.reach.leekexi.cassandra.hecter;   import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Map;   import javax.imageio.ImageIO;   public class ImagesCassandraClient {   public static String hosts = "192.168.1.20:9160"; public static String clusterName = "Test Cluster"; public static String keyspaceName = "CasImage"; public static String columnFamily = "ImagesFile";   @SuppressWarnings({ "rawtypes" }) public static void main(String[] args) {   // 参数装载 CassandraParas ps = new CassandraParas(); ps.setHosts(hosts); // 注解数据 ps.setClusterName(clusterName);// 群集名称 ps.setKeyspaceName(keyspaceName);// 键空间 ps.setColumnFamily(columnFamily);// 列族   // cassandra客户端API接口实例 CassandraClient cc = new CassandraClient(ps);   boolean inf = false;// 插入标记 String key = "1";// 插入的Key   // 测试多个字段插入和读取 String[] columnNames = { "ImagesFileId", "FileName" }; String[] columnValues = { "1", "http://avatar.csdn.net/3/1/8/3_jemlee2002.jpg" }; inf = cc.insertMultiColumn(key, columnNames, columnValues);   if (inf)// 如果插入成功则测试打印出来 { Map map = new HashMap(); map = cc.getMultiColumn(key, columnNames); for (int i = 0; i < map.size(); i++) System.out.println(columnNames[i] + " : " + map.get(columnNames[i])); } else { System.out.println("操作数据失败,CF=" + columnFamily); }  //把图片存储到Cassandra数据库 String columnName = "FileByteDatas"; String columnValue = parserFileNet("http://avatar.csdn.net/3/1/8/3_jemlee2002.jpg","jpg"); inf = cc.insertOneColumn(key, columnName, columnValue); if (inf) { System.out.println(cc.getOneColumn(key, columnName)); }  //把数据库的种的图片数据还原成图片 //如果在C盘下看到了和http://avatar.csdn.net/3/1/8/3_jemlee2002.jpg一个样的图片数据,证明数据处理成功。 columnValue = cc.getOneColumn(key, columnName); String localpath = "c:\\3_jemlee2002.jpg"; String type = "png"; boolean ref = revertImage(columnValue,localpath,type); if(ref) System.out.println("创建文件:" + localpath + " 成功."); else System.out.println("创建文件:" + localpath + " 失败.");   }  /**    * 网络文件存储  * @param   URLName 网络图片地址    * @param   type    图片类型    * @return  String  转换结果    * @throws    */   public static String parserFileNet(String URLName,String type) {        String res = null;        try {            int HttpResult = 0; // 服务器返回的状态            URL url = new URL(URLName); // 创建URL            URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码            urlconn.connect();            HttpURLConnection httpconn = (HttpURLConnection) urlconn;            HttpResult = httpconn.getResponseCode();            System.out.println(HttpResult);            if (HttpResult != HttpURLConnection.HTTP_OK) // 不等于HTTP_OK则连接不成功                System.out.print("fail");            else {                BufferedInputStream bis = new BufferedInputStream(urlconn.getInputStream());                   BufferedImage bm = ImageIO.read(bis);                ByteArrayOutputStream bos = new ByteArrayOutputStream();                ImageIO.write(bm, type, bos);                bos.flush();                byte[] data = bos.toByteArray();                   res = byte2hex(data);                bos.close();            }        } catch (Exception e) {            e.printStackTrace();        }        return res;    }      /**  * 本地文件存储  * @param filepath 本地文件路径  * @return String  转换结果    */ public static String parserFileLocal(String filepath) { File file = new File(filepath); byte[] bfile = new byte[10240]; String filestr = ""; try { InputStream a = new FileInputStream(file); a.read(bfile); filestr = byte2hex(bfile); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return filestr; }   /**    * 把Cassandra数据库中的图片数据还原成图片  * @param data      生成图片的二进制字符串    * @param fileName  图片名称(完整路径)    * @param type      图片类型    * @return    */   public static boolean revertImage(String data, String fileName,String type)   {           BufferedImage image = new BufferedImage(300, 300,BufferedImage.TYPE_BYTE_BINARY);        ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();        boolean rf = false;     try {            ImageIO.write(image, type, byteOutputStream);          byte[] bytes = hex2byte(data);            RandomAccessFile file = new RandomAccessFile(fileName, "rw");            file.write(bytes);            file.close();            rf = true;     } catch (IOException e) {        rf = false;         e.printStackTrace();        }        return rf; }           /** * 二进制转字符串 * @param  * @return */ public static String byte2hex(byte[] b)  {   String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; } return hs; }   /** * 字符串转二进制 * @param str * @return */ public static byte[] hex2byte(String str) {   if (str == null) return null;   str = str.trim(); int len = str.length(); if (len == 0 || len % 2 == 1) return null; byte[] b = new byte[len / 2]; try { for (int i = 0; i < str.length(); i += 2) { b[i / 2] = (byte) Integer .decode("0x" + str.substring(i, i + 2)).intValue(); } return b; } catch (Exception e) { return null; } }   }</pre></strong>    <strong>3、总结<br /> 以上代码高效的实现图片(含网络上的和本地的)存储到Cassandra数据的过程。特别提出,该方案中,中间并不需要中间暂存图片到本地,而是直接从http协议上获取图片流数据,这样极大的提高图片的处理速度。</strong>    <br />    <h1><span style="font-size:13px;">4、需要Cassandra操作API请到我的下载资源获取<br /> <br /> 来自:http://blog.csdn.net/jemlee2002/article/details/7211216</span></h1>