1. 程式人生 > >java操作MongoDB:使用GridFS對檔案進行操作

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;
}

}