如何使用Java向MongoDB中插入图片?

40

我想将图像文档存储在MongoDB中。我正在使用Java。

欢迎提供任何链接或建议。

3个回答

43

如果要存储像图片这样的二进制数据,您可以使用GridFS或实现自己的解决方案;下载驱动程序并查看src/test/com/mongodb/gridfs/GridFSTest.java ;)

编辑:今天你很幸运!我为您编写了完整的代码;)享受!

package mongodb.testing.java;
import com.mongodb.*;
import com.mongodb.gridfs.*;
import java.io.*;

public class Main {

    public static byte[] LoadImage(String filePath) throws Exception {
        File file = new File(filePath);
        int size = (int)file.length();
        byte[] buffer = new byte[size];
        FileInputStream in = new FileInputStream(file);
        in.read(buffer);
        in.close();
        return buffer;
    }

    public static void main(String[] args) throws Exception {
        //Load our image
        byte[] imageBytes = LoadImage("C:/Temp/bear.bmp");
        //Connect to database
        Mongo mongo = new Mongo( "127.0.0.1" );
        String dbName = "GridFSTestJava";
        DB db = mongo.getDB( dbName );
        //Create GridFS object
        GridFS fs = new GridFS( db );
        //Save image into database
        GridFSInputFile in = fs.createFile( imageBytes );
        in.save();

        //Find saved image
        GridFSDBFile out = fs.findOne( new BasicDBObject( "_id" , in.getId() ) );

        //Save loaded image from database into new image file
        FileOutputStream outputImage = new FileOutputStream("C:/Temp/bearCopy.bmp");
        out.writeTo( outputImage );
        outputImage.close();
    }
}

谢谢你的代码。我也为同样的过程编写了一段代码,但是你的比我的简单!!! - user405398
因此,要写入HTML文件,您会将服务器上的图片位置输出到HTML中吗? - Jeff
非常感谢,特别是关于'LoadImage'方法。 - Danilo Radenovic
非常感谢:) 真的很有帮助 - HMdeveloper
这适用于小于int大小的文件。大于此大小的文件需要使用分块并分部保存。 - tgkprog

5

对于小的(<1mb)图像,我建议将它们存储在二进制字段中(在Java中为byte[]);如果您有更大的文件,则GridFS效果更好。

我直接在我的文档中使用简单的二进制字段存储了许多缩略图。

我使用Morphia(http://code.google.com/p/morphia)来存储我的POJOs。


我打算在Mongo中存储大量图像,包括缩略图和普通大小的图像。对我来说,POJO是必要的吗?!! - user405398
你能告诉我在mongo中如何表示图片吗?比如,{ "x":1, "y":2 },如何表示图片? - user405398
你是如何存储图片的?全部放在一个文档中吗?还是将不同的文档放在同一集合中?如果我想要将多张图片存储在一个文档中,例如 { "name" : "Tamil", "age" : 23, "Images"{"image1" : 123.jpg, "image2": abc.jpg}},我该如何使用Java实现呢? - user405398

2

据我所知,您不能在mongodb中存储图像,您可以存储图像的链接。我说这话并没有高估自己,如果图像很小,比如100x100 px,您可以尝试以二进制形式存储图像,并即时重新生成图像。但是,渲染图像需要一些时间,因此建议您保存链接,仅在需要时动态获取该图像并填充。

您可以使用GridFS来存储较大的二进制对象。

由于您是新手,请参考以下内容:

链接1

链接2

Mongo+JAVA教程

GridFS规范

您也可以在SO上提问,我也是一个mongodb新手,不介意帮助新手:D


你如何将GridFS文件与mongodb中的普通文档链接起来?比如说,我正在上传一张大图片并将其存储在GridFS中。我将文件的其他细节保存在任何集合中的文档中。当我从集合中读取文档时,如何检索关联的图像? - user405398
1
我不知道是否有任何API方法可以做到这一点,但你可以通过在两个集合中创建一个具有相同值的字段来创建它们之间的链接。因此,当你在第一个集合中遇到该值时,只需使用该值查询图像集合,就可以找到相应的图像。 - theTuxRacer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接