如何在不在 MongoDB 中添加文件并使用 Java 的情况下使用 GridFSInputFile 和 GridFS?
How use GridFSInputFile and GridFS without add file in MongoDB and using Java?
我正在开发一个应用程序,当一些用户可以添加评论和附加文件时,它是 UI 中的一个简单表单。在这种情况下,有时可以选择添加文件,但必须添加注释。
如果用户在评论中添加文件......我有这个代码:
BasicDBObject metadata = new BasicDBObject();
metadata.put("_id", UUID.randomUUID().toString());
metadata.put("comentary", "Hola que hace");
metadata.put("date", (new Date().toString()));
metadata.put("applicationID", "1111-111");
GridFS gridFS = new GridFS(mongoTemplate.getDb(), "noteAndFile");
GridFSInputFile gfsFile = gridFS.createFile(file);
gfsFile.put("metadata", metadata);
gfsFile.save();
这段代码有效,但是用户没有添加文件我有这个:
BasicDBObject metadata = new BasicDBObject();
metadata.put("_id", UUID.randomUUID().toString());
metadata.put("comentary", "Segundo persist");
metadata.put("date", (new Date().toString()));
metadata.put("applicationID", "2222-222");
GridFS gridFS = new GridFS(mongoTemplate.getDb(), "noteAndFile");
GridFSInputFile gfsFile = gridFS.createFile();
gfsFile.put("metadata", metadata);
gfsFile.save();
但 gfsFile.save();
return 无效。以后肯定要用这种方式获取有无文件附件的评论列表。
BasicDBObject allComentaryWithOrNotFileAttach = new BasicDBObject();
List<GridFSDBFile> files = gridFS.find(allComentaryWithOrNotFileAttach);
我该怎么做?
我认为您在这里唯一缺少的是 "empty" 输入流,其中没有文件附件。这很容易修复:
String mystring = new String(); // an empty string
GridFS gridFS = new GridFS(mongoTemplate.getDB(),"noteAndFile");
GridFSInputFile gfsFile = gridFS.createFile(
new ByteArrayInputStream( mystring.getBytes() )
);
BasicDBObject meta = new BasicDBObject();
meta.put("comments","hi");
gfsFile.put("metadata",meta);
gfsFile.save();
System.out.println(gfsFile.getId()); // gives me the _id of the object saved
当我去 shell 中寻找时:
> db.noteAndFile.files.findOne()
{
"_id" : ObjectId("55a909057c712d9f488c88e7"),
"chunkSize" : NumberLong(261120),
"length" : NumberLong(0),
"md5" : "d41d8cd98f00b204e9800998ecf8427e",
"filename" : null,
"contentType" : null,
"uploadDate" : ISODate("2015-07-17T13:54:13.837Z"),
"aliases" : null,
"metadata" : {
"comments" : "hi"
}
}
当然既然这里的"bytestream"是空的,那么"chunks"集合就没有对象关联了。但这应该是预料之中的。
因此您以后可以随时获取此对象并向其添加实际内容,如果可用的话。
我正在开发一个应用程序,当一些用户可以添加评论和附加文件时,它是 UI 中的一个简单表单。在这种情况下,有时可以选择添加文件,但必须添加注释。 如果用户在评论中添加文件......我有这个代码:
BasicDBObject metadata = new BasicDBObject();
metadata.put("_id", UUID.randomUUID().toString());
metadata.put("comentary", "Hola que hace");
metadata.put("date", (new Date().toString()));
metadata.put("applicationID", "1111-111");
GridFS gridFS = new GridFS(mongoTemplate.getDb(), "noteAndFile");
GridFSInputFile gfsFile = gridFS.createFile(file);
gfsFile.put("metadata", metadata);
gfsFile.save();
这段代码有效,但是用户没有添加文件我有这个:
BasicDBObject metadata = new BasicDBObject();
metadata.put("_id", UUID.randomUUID().toString());
metadata.put("comentary", "Segundo persist");
metadata.put("date", (new Date().toString()));
metadata.put("applicationID", "2222-222");
GridFS gridFS = new GridFS(mongoTemplate.getDb(), "noteAndFile");
GridFSInputFile gfsFile = gridFS.createFile();
gfsFile.put("metadata", metadata);
gfsFile.save();
但 gfsFile.save();
return 无效。以后肯定要用这种方式获取有无文件附件的评论列表。
BasicDBObject allComentaryWithOrNotFileAttach = new BasicDBObject();
List<GridFSDBFile> files = gridFS.find(allComentaryWithOrNotFileAttach);
我该怎么做?
我认为您在这里唯一缺少的是 "empty" 输入流,其中没有文件附件。这很容易修复:
String mystring = new String(); // an empty string
GridFS gridFS = new GridFS(mongoTemplate.getDB(),"noteAndFile");
GridFSInputFile gfsFile = gridFS.createFile(
new ByteArrayInputStream( mystring.getBytes() )
);
BasicDBObject meta = new BasicDBObject();
meta.put("comments","hi");
gfsFile.put("metadata",meta);
gfsFile.save();
System.out.println(gfsFile.getId()); // gives me the _id of the object saved
当我去 shell 中寻找时:
> db.noteAndFile.files.findOne()
{
"_id" : ObjectId("55a909057c712d9f488c88e7"),
"chunkSize" : NumberLong(261120),
"length" : NumberLong(0),
"md5" : "d41d8cd98f00b204e9800998ecf8427e",
"filename" : null,
"contentType" : null,
"uploadDate" : ISODate("2015-07-17T13:54:13.837Z"),
"aliases" : null,
"metadata" : {
"comments" : "hi"
}
}
当然既然这里的"bytestream"是空的,那么"chunks"集合就没有对象关联了。但这应该是预料之中的。
因此您以后可以随时获取此对象并向其添加实际内容,如果可用的话。