我想具体了解如何保存带有图像的对象。我想要做的是保存一个包含图像的整个对象,必须保存图像。我试过这个,但它只保存文件路径的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中保存图像但是没有将其转换为字节数组????
答案 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