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

> 原文： [https://howtodoinjava.com/mongodb/java-mongodb-getsave-image-using-gridfs-apis/](https://howtodoinjava.com/mongodb/java-mongodb-getsave-image-using-gridfs-apis/)

在先前的教程中，我们了解了 [MongoDB 基础知识](//howtodoinjava.com/nosql/introduction-to-mongodb-why-mongodb/ "Introduction to MongoDB: Why MongoDB?")和[在 Windows](//howtodoinjava.com/nosql/mongodb/how-to-install-mongodb-on-windows/ "How to Install MongoDB on Windows") 中安装 MongoDB 的知识，以及有关[在 MongoDB 中插入文档](//howtodoinjava.com/nosql/mongodb/java-mongodb-insert-documents-in-collection-examples/ "Java MongoDB : Insert Document(s) in Collection Examples")和[从 MongoDB 选择文档](//howtodoinjava.com/nosql/mongodb/mongodb-selectqueryfind-documents-examples/ "MongoDB : Select/Query/Find Document(s) Examples")的知识。 在本教程中，我仅提供一些代码示例，这些代码示例将在您必须使用图像或其他二进制数据类型来从 MongoDB 存储/检索/删除此类数据时提供帮助。

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

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

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

```java
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

```java
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 获取/检索图像

```java
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 获取/检索所有图像

```java
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 }

```

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

```java
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 删除图像

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

```

## 完整的示例代码

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

```java
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/](http://docs.mongodb.org/manual/core/gridfs/ "gridfs")