如何使用文件上传字段中的Objectory / Dart将二进制文件保存到Mongodb?
答案 0 :(得分:3)
实际上你的问题在许多层面都有很多含义。 基本上在MongoDB级别,可以将二进制数据保存在二进制类型的普通文档的字段中。我相信它现在在mongo_dart中工作。 在objectory_console(通过mongo_dart直接与mongodb通信的对象的服务器端版本)我认为它也可以工作。 你的模型对象就像
class UploadedFile extends PersistentObject {
String get fileName => getProperty('fileName');
set fileName(String value) => setProperty('fileName',value);
BsonBinary get content => getProperty('content');
set content(BsonBinary value) => setProperty('content',value);
....
....
}
BsonBinary命名了构造函数BsonBinary.from(List from)
,它有效但仅适用于dart:io(在服务器端)
对于基于浏览器的目标,您可以使用命名构造函数BsonBinary.fromHexString()
。
我担心这会产生很大的开销。
另一个考虑因素是MongoDB中文档总大小的限制,即16mb。所以你的文件必须小于那个大小。
通过GridFS层在MongoDB中存储更大的一个文件的文件,最近在mongo_dart中添加了GridFS支持。
来自https://github.com/vadimtsushko/mongo_dart/blob/master/test/gridfs_tests.dart的使用示例:
Future testFileToGridFSToFile() {
GridFS.DEFAULT_CHUNKSIZE = 30;
GridIn input;
String dir = path.dirname(path.fromUri(Platform.script));
var inputStream = new File('$dir/gridfs_testdata_in.txt').openRead();
Db db = new Db('${DefaultUri}mongo_dart-test');
return db.open().then((c){
var gridFS = new GridFS(db);
clearFSCollections(gridFS);
input = gridFS.createFile(inputStream, "test");
return input.save();
}).then((c) {
var gridFS = new GridFS(db);
return gridFS.getFile('test');
}).then((GridOut gridOut) {
return gridOut.writeToFilename('$dir/gridfs_testdata_out.txt');
}).then((c){
List<int> dataIn = new File('$dir/gridfs_testdata_in.txt').readAsBytesSync();
List<int> dataOut = new File('$dir/gridfs_testdata_out.txt').readAsBytesSync();
expect(dataOut, orderedEquals(dataIn));
db.close();
});
}