使用Java在mongoDB中保存带有图像的对象(同时保存对象数据和图像)

时间:2013-05-24 10:18:51

标签: spring mongodb mongodb-java

我想具体了解如何保存带有图像的对象。我想要做的是保存一个包含图像的整个对象,必须保存图像。我试过这个,但它只保存文件路径的File实例。它没有保存图像。任何帮助,将不胜感激。谢谢。这是我保存对象的代码,但它保存文件实例而不是图像。

import java.io.File;    
import org.springframework.data.mongodb.core.mapping.Document;
import com.discusit.model.Artwork;

@Document(collection="Artwork")
public class ArtworkImpl implements Artwork {

    private String artworkName;
    private String artworkVersion;
    private String fileName;
    private File file;

    public ArtworkImpl() {

    }

    public ArtworkImpl(String name, String version, String fileName, File file) {
        this.artworkName = name;
        this.artworkVersion = version;
        this.fileName = fileName;
        this.file = file;
    }

    public String getArtworkName() {
        return artworkName;
    }

    public void setArtworkName(String artworkName) {
        this.artworkName = artworkName;
    }

    public String getArtworkVersion() {
        return artworkVersion;
    }

    public void setArtworkVersion(String artworkVersion) {
        this.artworkVersion = artworkVersion;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }   
}

这是我的主要方法: - 注意:主方法工作正常,但不保存图像,而是保存文件实例。

public class MainApplication {

    public static void main(String[] args) {

    ApplicationContext ctx = 
                     new AnnotationConfigApplicationContext(SpringMongoConfig.class);
    GridFsOperations gridOperations = 
                      (GridFsOperations) ctx.getBean("gridFsTemplate");

    DBObject metaData = new BasicDBObject();
    metaData.put("extra1", "anything 1");
    metaData.put("extra2", "anything 2");

    InputStream inputStream = null;
    try {
        inputStream = new FileInputStream("/home/discusit/Downloads/birds.jpg");
        gridOperations.store(inputStream, "birds.jpg", "image/jpg", metaData);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

        System.out.println("Done");
    }

}

我想用图像保存对象。

更新:我这样做但是通过将图像转换为字节数组并获取字节数组并转换回Image,只是想知道有没有其他方法可以直接在mongoDB中保存图像但是没有将其转换为字节数组????

1 个答案:

答案 0 :(得分:3)

您需要澄清有关mongoDB的以下内容:

1. MongoDB是一个面向文档的数据库,其中文档以BSON格式存储,最大限度为16MB。 “将BSON视为JSON(JavaScript Object Notation)文档的二进制表示”[1]。

BSON格式支持BinData类型,只要不超出16MB限制,您就可以存储文件的二进制表示。

2. MongoDB提供了一种存储文件的方法GridFS“GridFS是一种用于存储和检索超过BSON文档大小限制为16MB的文件的规范”[2]。

GridFS将文件分成256K块,并使用两个集合来存储文件,一个用于元数据,一个用于文件块,此集合称为 fs.files fs。分块

存储在这些集合中的文件如下所示:

>db.fs.files.find()
{
  "_id": ObjectId("51a0541d03643c8cf4122760"),
  "chunkSize": NumberLong("262144"),
  "length": NumberLong("3145782"),
  "md5": "c5dda7f15156783c53ffa42b422235b2",
  "filename": "test.png",
  "contentType": "image/bmp",
  "uploadDate": ISODate("2013-05-25T06:03:09.611Z"),
  "aliases": null,
  "metadata": {
    "extra1": "anything 1",
    "extra2": "anything 2"
  }
}


>db.fs.chunks.find()
{
"_id": ObjectId("51a0541e03643c8cf412276c"),
  "files_id": ObjectId("51a0541d03643c8cf4122760"),
  "n": 11,
  "data": BinData(0, "BINARY_DATA_WILL_BE_STORED_HERE")
}
.
.

请注意文件集合中的 ObjectId 与块集合中的 files_id 相匹配。

在澄清之后,对您的问题的简短回答是:

是的,您可以使用GridFS将文件直接存储在mongoDB中。

在以下链接中,您可以找到使用Spring Data的GridFS工作示例:

http://www.mkyong.com/mongodb/spring-data-mongodb-save-binary-file-gridfs-example/

[1] http://docs.mongodb.org/manual/reference/glossary/#term-bson

[2] http://docs.mongodb.org/manual/core/gridfs/