如何使用Objectory将二进制文件保存到Mongodb

时间:2012-11-07 21:43:34

标签: mongodb dart

如何使用文件上传字段中的Objectory / Dart将二进制文件保存到Mongodb?

1 个答案:

答案 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();
  });
}