Java MongoDB:使用 GridFS API 获取/保存图像

Java MongoDB:使用 GridFS API 获取/保存图像

原文: https://howtodoinjava.com/mongodb/java-mongodb-getsave-image-using-gridfs-apis/

在先前的教程中,我们了解了 MongoDB 基础知识在 Windows 中安装 MongoDB 的知识,以及有关在 MongoDB 中插入文档从 MongoDB 选择文档的知识。 在本教程中,我仅提供一些代码示例,这些代码示例将在您必须使用图像或其他二进制数据类型来从 MongoDB 存储/检索/删除此类数据时提供帮助。

对于 CRUD 操作,我们将使用 MongoDB 的 GridFS API 。 在理想情况下,GridFS 是规范,用于存储和检索超出 BSON 文档大小限制 16MB 的文件。 而不是将文件存储在单个文档中, GridFS 将文件划分为多个部分或大块,并将这些大块中的每个存储为单独的文档。 默认情况下,GridFS 将块大小限制为 255k。 GridFS 使用两个集合来存储文件。 一个集合存储文件块,另一个集合存储文件元数据。

当您查询 GridFS 存储中的文件时,驱动或客户端将根据需要重新组装块。 您可以对通过 GridFS 存储的文件执行范围查询。 您还可以从文件的任意部分访问信息,从而可以“跳入”视频或音频文件的中间。

GridFS 不仅可用于存储超过 16MB 的文件,而且还可用于存储要访问的任何文件,而不必将整个文件加载到内存中。

Code Examples List

Save an image into MongoDB
Get/Retrieve an image from MongoDB
Get/Retrieve all images from MongoDB
Save the retrieved image into local file-system
Delete an image from MongoDB

为了进行测试,我将图像存储在名为DemoImage.png的临时位置(c:驱动器)中。 我将此图像存储到 MongoDB 中。

将图像保存到 MongoDB

private static void saveImageIntoMongoDB(DB db) throws IOException {
	String dbFileName = "DemoImage";
	File imageFile = new File("c:\\DemoImage.png");
	GridFS gfsPhoto = new GridFS(db, "photo");
	GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
	gfsFile.setFilename(dbFileName);
	gfsFile.save();
}

从 MongoDB 获取/检索图像

private static void getSingleImageExample(DB db) {
	String newFileName = "c:/DemoImage";
	GridFS gfsPhoto = new GridFS(db, "photo");
	GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
	System.out.println(imageForOutput);
}

Output:

{ "_id" : { "$oid" : "53cff8d736414e8af4a4f0b8"} , "chunkSize" : 262144 , "length" : 138855 , 
"md5" : "b75f77c16c3ac6472365c06cde15d0da" , "filename" : "DemoImage" , "contentType" :  null  , 
"uploadDate" : { "$date" : "2014-07-23T18:03:03.403Z"} , "aliases" :  null }

从 MongoDB 获取/检索所有图像

private static void listAllImages(DB db) {
	GridFS gfsPhoto = new GridFS(db, "photo");
	DBCursor cursor = gfsPhoto.getFileList();
	while (cursor.hasNext()) {
		System.out.println(cursor.next());
	}
}

Output:

{ "_id" : { "$oid" : "53cff8d736414e8af4a4f0b8"} , "chunkSize" : 262144 , "length" : 138855 , 
"md5" : "b75f77c16c3ac6472365c06cde15d0da" , "filename" : "DemoImage" , "contentType" :  null  , 
"uploadDate" : { "$date" : "2014-07-23T18:03:03.403Z"} , "aliases" :  null }

将检索到的图像保存到本地文件系统中

private static void saveToFileSystem(DB db) throws IOException {
	String dbFileName = "DemoImage";
	GridFS gfsPhoto = new GridFS(db, "photo");
	GridFSDBFile imageForOutput = gfsPhoto.findOne(dbFileName);
	imageForOutput.writeTo("c:/DemoImageNew.png");
}

从 MongoDB 删除图像

private static void deleteImageFromMongoDB(DB db) {
	String dbFileName = "DemoImage";
	GridFS gfsPhoto = new GridFS(db, "photo");
	gfsPhoto.remove(gfsPhoto.findOne(dbFileName));
}

完整的示例代码

以下是构建以上简短示例的完整信息。 随意玩。

package examples.mongodb.crud;

import java.io.File;
import java.io.IOException;

import com.mongodb.DB;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;

public class MongoDBBinaryExample 
{
	public static void main(String[] args) throws IOException 
	{
		MongoClient mongo = new MongoClient("localhost", 27017);
		DB db = mongo.getDB("howtodoinjava");
		//Save a image in DB
		saveImageIntoMongoDB(db);
		//Get a image from DB
		getSingleImageExample(db);
		//Get all images from DB
		listAllImages(db);
		saveToFileSystem(db);		
		//Delete images from DB
		deleteImageFromMongoDB(db);

		//Verifying if image was deleted or not
		getSingleImageExample(db);
	}

	private static void saveImageIntoMongoDB(DB db) throws IOException {
		String dbFileName = "DemoImage";
		File imageFile = new File("c:\\DemoImage.png");
		GridFS gfsPhoto = new GridFS(db, "photo");
		GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
		gfsFile.setFilename(dbFileName);
		gfsFile.save();
	}

	private static void getSingleImageExample(DB db) {
		String newFileName = "c:/DemoImage";
		GridFS gfsPhoto = new GridFS(db, "photo");
		GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
		System.out.println(imageForOutput);
	}

	private static void listAllImages(DB db) {
		GridFS gfsPhoto = new GridFS(db, "photo");
		DBCursor cursor = gfsPhoto.getFileList();
		while (cursor.hasNext()) {
			System.out.println(cursor.next());
		}
	}

	private static void saveToFileSystem(DB db) throws IOException {
		String dbFileName = "DemoImage";
		GridFS gfsPhoto = new GridFS(db, "photo");
		GridFSDBFile imageForOutput = gfsPhoto.findOne(dbFileName);
		imageForOutput.writeTo("c:/DemoImageNew.png");
	}

	private static void deleteImageFromMongoDB(DB db) {
		String dbFileName = "DemoImage";
		GridFS gfsPhoto = new GridFS(db, "photo");
		gfsPhoto.remove(gfsPhoto.findOne(dbFileName));
	}
}

Output:

{ "_id" : { "$oid" : "53cff8d736414e8af4a4f0b8"} , "chunkSize" : 262144 , "length" : 138855 , "md5" : "b75f77c16c3ac6472365c06cde15d0da" , "filename" : "DemoImage" , "contentType" :  null  , "uploadDate" : { "$date" : "2014-07-23T18:03:03.403Z"} , "aliases" :  null }
{ "_id" : { "$oid" : "53cff8d736414e8af4a4f0b8"} , "chunkSize" : 262144 , "length" : 138855 , "md5" : "b75f77c16c3ac6472365c06cde15d0da" , "filename" : "DemoImage" , "contentType" :  null  , "uploadDate" : { "$date" : "2014-07-23T18:03:03.403Z"} , "aliases" :  null }

null

这就是本简单教程的全部内容。 希望它能帮助有需要的人。

祝您学习愉快!

参考http://docs.mongodb.org/manual/core/gridfs/