Сохраните объект с изображением (сохраните как данные объекта, так и изображение) внутри 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");
    }

}

Я хочу сохранить объект с изображением.

ОБНОВЛЕНИЕ: я сделал это, но преобразовал изображение в массив байтов, извлек массив байтов и преобразовал обратно в изображение, просто хочу знать, есть ли другой способ сохранить изображение непосредственно в mongoDB, но без преобразования его в массив байтов? ???


person Bilbo Baggins    schedule 24.05.2013    source источник


Ответы (1)


Вам необходимо уточнить следующее о mongoDB:

1. MongoDB — это база данных, ориентированная на документы, в которой документы хранятся в формате BSON и имеют максимальный размер 16 МБ. «Думайте о BSON как о двоичном представлении документов JSON (нотация объектов JavaScript)» [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/#term-bson

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

person Alejandro    schedule 25.05.2013
comment
Спасибо за ответ на вопрос, я знаю, что могу хранить файлы с помощью GridFS, но я хочу сохранить объект человека с более чем одним изображением этого человека в этом объекте. я могу сделать это ??? Я уже успешно пробовал то, что вы упомянули на mkyong.com ... :) - person Bilbo Baggins; 26.05.2013
comment
Я тоже нашел способ обойти это, я преобразовал изображение в байт [], а затем сохранил его, а затем преобразовал байт [] в изображение... но могу ли я сохранить весь объект с изображениями внутри него всего за один раз ??? или есть другие предложения??? - person Bilbo Baggins; 26.05.2013
comment
Если вы не хотите использовать GridFS, вы можете сохранить двоичное представление ваших файлов в документе BSON, позаботившись об ограничении размера в 16 МБ. Если вы ищете способ сделать это всего за один шаг, вы можете использовать CustomConverter для сопоставления между DBobjects и пользовательскими объектами, взгляните на следующую ссылку для соответствующей документации Spring: static.springsource.org/spring-data/data- монгодб/документы/текущий/ - person Alejandro; 27.05.2013