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