java操作MongoDB:使用GridFS對檔案進行操作
使用mongbd儲存圖片,檔案等效率要比存在oracle等關係型資料庫要好,這是大家公認的,。。。。
好了,廢話不多說,直接上程式碼
package com.aspirecn.hzyl.base.utils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.UnknownHostException;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.MongoOptions;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
public class MongoDbUtils {
/**
* 地址
*/
private static String ipAddr = null;
/**
* 埠
*/
private static int port = 27017;
/**
*使用者名稱
*/
private static String userName = null;
/**
* 密碼
*/
private static String passwd = null;
/**
* 連線池大小
*/
private static int poolSize = 50;
private static int blockSize = 50;
public static Mongo mongo = null;
/**
* 是否需要驗證<br>
* 當mongdb設定許可權的時候需要驗證,否則預設不需要
*/
private static boolean authFlag = false;
public MongoDbUtils(String ipAddr, String port, String userName,
String passwd, String poolSize, String blockSize) {
MongoDbUtils.ipAddr = ipAddr;
MongoDbUtils.passwd = passwd;
MongoDbUtils.userName = userName;
if (CommonUtils.isNotBlank(port)) {
MongoDbUtils.port = Integer.valueOf(port);
}
if (CommonUtils.isNotBlank(blockSize)) {
MongoDbUtils.blockSize = Integer.valueOf(blockSize);
}
if (CommonUtils.isNotBlank(poolSize)) {
MongoDbUtils.poolSize = Integer.valueOf(poolSize);
}
}
/**
* 獲取Mongo
* @return
* @throws UnknownHostException
* @throws MongoException
*/
public static Mongo getMongoDb() throws UnknownHostException,
MongoException {
if (mongo == null) {
init();
}
return mongo;
}
/**
* 首次初始化物件
* @throws UnknownHostException
* @throws MongoException
*/
public static void init() throws UnknownHostException, MongoException {
mongo = new Mongo(ipAddr, port);
MongoOptions opt = mongo.getMongoOptions();
opt.connectionsPerHost = poolSize;
opt.autoConnectRetry = true;
opt.threadsAllowedToBlockForConnectionMultiplier = blockSize;
}
/**
* 儲存檔案到MongoDB伺服器
*
* @param file
* 檔案
* @param db
* 資料庫名
* @param bucket
* 檔案集名
* @param fileName
* 檔名
* @return
* @throws MongoException
* @throws IOException
* @throws Exception
*/
public static boolean saveFileToMongo(File file, String db, String bucket,
String fileName) throws MongoException, IOException {
try {
//1.獲取連線,相當於jdbc連線oracle時的
Mongo mongo = MongoDbUtils.getMongoDb();
//2.根據資料庫名連線到資料庫
DB mongoDb = mongo.getDB(db);
//3.認證許可權
if (!authFlag) {
authFlag = mongoDb.authenticate(MongoDbUtils.userName,
MongoDbUtils.passwd.toCharArray());
}
GridFS myFS = new GridFS(mongoDb, bucket);
GridFSInputFile inputFile = myFS.createFile(file);
inputFile.setFilename(fileName);
inputFile.save();
} catch (IOException ex) {
mongo = null;
throw ex;
}
return true;
}
/**
* 從MongoDB伺服器刪除檔案
*
* @param db
* 資料庫名
* @param bucket
* 檔案集名
* @param fileName
* 檔名
* @return
* @throws MongoException
* @throws IOException
* @throws Exception
*/
public static boolean deleteFileFromMongo(String db, String bucket,
String fileName) throws UnknownHostException, MongoException {
Mongo mongo = MongoDbUtils.getMongoDb();
DB mongoDb = mongo.getDB(db);
if (!authFlag) {
authFlag = mongoDb.authenticate(MongoDbUtils.userName,
MongoDbUtils.passwd.toCharArray());
}
GridFS myFS = new GridFS(mongoDb, bucket);
myFS.remove(fileName);
return true;
}
/**
* 從MONGODB資料庫中讀取檔案
*
* @param db
* @param bucket
* @param fileName
* @return
* @throws UnknownHostException
* @throws MongoException
*/
public static InputStream getFileFromMongo(String db, String bucket,
String fileName) throws UnknownHostException, MongoException {
Mongo mongo = MongoDbUtils.getMongoDb();
DB mongoDb = mongo.getDB(db);
if (!authFlag) {
authFlag = mongoDb.authenticate(MongoDbUtils.userName,
MongoDbUtils.passwd.toCharArray());
}
GridFS myFS = new GridFS(mongoDb, bucket);
GridFSDBFile imageForOutput = myFS.findOne(fileName);
InputStream input = null;
if (imageForOutput != null) {
input = imageForOutput.getInputStream();
}
return input;
}
/**
* 從MongoDB讀取檔案
* @param db
* @param bucket
* @param fileName
* @return
* @throws UnknownHostException
* @throws MongoException
*/
public static GridFSDBFile getDBFileFromMongo(String db, String bucket,
String fileName) throws UnknownHostException, MongoException {
Mongo mongo = MongoDbUtils.getMongoDb();
DB mongoDb = mongo.getDB(db);
if (!authFlag) {
authFlag = mongoDb.authenticate(MongoDbUtils.userName,
MongoDbUtils.passwd.toCharArray());
}
GridFS myFS = new GridFS(mongoDb, bucket);
GridFSDBFile imageForOutput = myFS.findOne(fileName);
return imageForOutput;
}
/**
* 上傳檔案到MongoDB伺服器上 如果該檔案key已存在,先刪除該key對應的檔案,再新增
*
* @param data
* 檔案位元組
* @param db
* 資料庫名
* @param bucket
* 檔案集名
* @param fileName
* 檔名
* @return
* @throws MongoException
* @throws IOException
* @throws Exception
*/
public static boolean uploadFileToMongo(File file, String db,
String bucket, String fileName) throws MongoException, IOException {
try {
Mongo mongo = MongoDbUtils.getMongoDb();
DB mongoDb = mongo.getDB(db);
if (!authFlag) {
authFlag = mongoDb.authenticate(MongoDbUtils.userName,
MongoDbUtils.passwd.toCharArray());
}
GridFS myFS = new GridFS(mongoDb, bucket);
GridFSDBFile imageForOutput = myFS.findOne(fileName);
if (imageForOutput != null) {
myFS.remove(fileName);
}
GridFSInputFile inputFile = myFS.createFile(file);
inputFile.setFilename(fileName);
inputFile.save();
} catch (IOException ex) {
mongo = null;
throw ex;
}
return true;
}
/**
* 上傳檔案到MongoDB伺服器上 如果該檔案key已存在,先刪除該key對應的檔案,再新增
*
* @param file
* 檔案
* @param db
* 資料庫名
* @param bucket
* 檔案集名
* @param fileName
* 檔名
* @return
* @throws MongoException
* @throws IOException
* @throws Exception
*/
public static boolean uploadFileToMongo(byte[] data, String db,
String bucket, String fileName) throws MongoException, IOException {
try {
Mongo mongo = MongoDbUtils.getMongoDb();
DB mongoDb = mongo.getDB(db);
if (!authFlag) {
authFlag = mongoDb.authenticate(MongoDbUtils.userName,
MongoDbUtils.passwd.toCharArray());
}
GridFS myFS = new GridFS(mongoDb, bucket);
GridFSDBFile imageForOutput = myFS.findOne(fileName);
if (imageForOutput != null) {
myFS.remove(fileName);
}
GridFSInputFile inputFile = myFS.createFile(data);
inputFile.setFilename(fileName);
inputFile.save();
} catch (IOException ex) {
mongo = null;
throw ex;
}
return true;
}
/**
* 上傳檔案到MongoDB伺服器上 如果該檔案key已存在,先刪除該key對應的檔案,再新增
*
* @param file
* 檔案
* @param db
* 資料庫名
* @param bucket
* 檔案集名
* @param fileName
* 檔名
* @return
* @throws MongoException
* @throws IOException
* @throws Exception
*/
public static boolean uploadFileToMongo(InputStream input, String db,
String bucket, String fileName) throws MongoException, IOException {
try {
Mongo mongo = MongoDbUtils.getMongoDb();
DB mongoDb = mongo.getDB(db);
if (!authFlag) {
authFlag = mongoDb.authenticate(MongoDbUtils.userName,
MongoDbUtils.passwd.toCharArray());
}
GridFS myFS = new GridFS(mongoDb, bucket);
GridFSDBFile imageForOutput = myFS.findOne(fileName);
if (imageForOutput != null) {
myFS.remove(fileName);
}
GridFSInputFile inputFile = myFS.createFile(input);
inputFile.setFilename(fileName);
inputFile.save();
} catch (IOException ex) {
mongo = null;
throw ex;
}
return true;
}
}