如何使用文件上传字段中的 Objectory/Dart 将二进制文件保存到 Mongodb?
问问题
523 次
1 回答
3
实际上,您的问题在许多层面上都有很多含义。基本上在 MongoDB 一级可以将二进制数据保存在普通文档的二进制类型的字段中。我相信它现在正在 mongo_dart 中工作。在 objectory_console (通过 mongo_dart 直接与 mongodb 通信的 objectory 的服务器端版本)我认为它也可以工作。你的模型对象会像
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();
});
}
于 2012-11-08T06:55:07.303 回答