个人在项目中遇到需要往mongo里保存图片和文件,整体做下来写个随笔,也算是个总结。
MongoDB是一种非关系型数据库(NoSql),很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象。Mongo DB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD操作。
一般mongo建库的时候自带有files(文件),mail(邮件).....等库,这里我做的时候就把图片直接保存到了wechat_cc3下的GridFS下的HeadImage下。
1 import com.jfinal.kit.PropKit; 2 import com.mongodb.DB; 3 import com.mongodb.MongoClient; 4 import com.mongodb.gridfs.GridFS; 5 import com.mongodb.gridfs.GridFSDBFile; 6 import com.mongodb.gridfs.GridFSInputFile; 7 8 import java.io.*; 9 import java.net.URL; 10 import java.net.URLConnection; 11 import java.net.UnknownHostException; 12 13 public class imageUtil { 14 15 public static String getImageByUrl(String imageurl, String openId){ 16 GridFSInputFile gridFSInputFile; 17 GridFS myFS = null; 18 MongoClient mongoClient = null; 19 try { 20 mongoClient = MongoConnUtil.getConn(); 21 DB db = mongoClient.getDB(PropKit.get("mongodb.db","ztct_cc3")); 22 myFS = new GridFS(db,"HeadImage"); 23 // 构造URL 24 URL url = new URL(imageurl); 25 // 打开连接 26 URLConnection con = url.openConnection(); 27 // 输入流 28 InputStream is = con.getInputStream();
// 这里需要先删除已存在文件,如果已存在会默认保存不进去 29 myFS.remove(openId); 30 GridFSDBFile gridFSDBFile = myFS.findOne(openId); 31 gridFSInputFile = myFS.createFile(is); 32 gridFSInputFile.put("_id", openId); 33 gridFSInputFile.setFilename(openId); 34 gridFSInputFile.setContentType("jpg"); 35 gridFSInputFile.save(); 36 is.close(); 37 return "success"; 38 } catch (Exception e) { 39 return "error"; 40 } 41 } 42 43 }
主要在这两步
拿到照片流
InputStream is = con.getInputStream();
存进库里
gridFSInputFile = myFS.createFile(is);
import com.jfinal.kit.PropKit; import com.mongodb.MongoClient; import java.net.UnknownHostException; public class MongoConnUtil { private static MongoClient mongoClient = null; public static MongoClient getConn() throws UnknownHostException { if(mongoClient == null){ intializeMongoClient(); } return mongoClient; } private static void intializeMongoClient() throws UnknownHostException { String host = PropKit.get("mongodb.ip", "127.0.0.1"); int port = PropKit.getInt("mongodb.port",27017); mongoClient = new MongoClient( host , port ); } public static synchronized void closeConnection(){ if(mongoClient != null){ mongoClient.close(); } } }
我这里得到的图片是一个url,所以直接读取url把流存进mongo里。如果需要存本地的图片改下获取图片的代码,其他一样就行。
【施主,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。非常感谢!】