Сохраните объект с изображением (сохраните как данные объекта, так и изображение) внутри mongoDB, используя Java

Я хочу знать конкретно о сохранении объекта с изображением внутри него. То, что я хочу сделать, это сохранить весь объект с изображением внутри, изображение должно быть сохранено. Я пробовал это, но он сохраняет только экземпляр файла с путем к файлу. Это не сохранение изображения. Любая помощь будет оценена. Спасибо. Вот мой код для сохранения объекта, но он сохраняет экземпляр файла вместо изображения.

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 ответ

Решение

Вы должны уточнить следующее о mongoDB:

1. MongoDB - это документно-ориентированная база данных, в которой документы хранятся в формате BSON и имеют максимальный размер 16 МБ. "Думайте о BSON как о двоичном представлении документов JSON (JavaScript Object Notation)"[1].

Формат BSON поддерживает тип BinData, в котором вы можете хранить двоичное представление файла до тех пор, пока не будет превышен предел в 16 МБ.

2. MongoDB предоставляет способ хранения файлов GridFS "GridFS - это спецификация для хранения и извлечения файлов, размер которых превышает BSON-документ в 16 МБ" [2].

GridFS делит файлы на куски по 256 КБ и использует две коллекции для хранения файлов, одну для метаданных и одну для файловых блоков, эти коллекции называются fs.files и fs.chunks соответственно.

Файл, хранящийся в этих коллекциях, выглядит следующим образом:

>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 в коллекциях чанков.

После этого уточнения краткий ответ на ваш вопрос:

Да, вы можете хранить файлы непосредственно в mongoDB, используя GridFS.

По следующей ссылке вы можете найти рабочий пример GridFS с использованием Spring Data:

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

[1] http://docs.mongodb.org/manual/reference/glossary/

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

Другие вопросы по тегам