-2

ファイルアップロードフィールドから Objectory/Dart を使用してバイナリファイルを Mongodb に保存する方法は?

4

1 に答える 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()。これにより、かなりのオーバーヘッドが発生するのではないかと心配しています。

もう 1 つの考慮事項は、MongoDB の合計ドキュメント サイズの制限です。これは 16 MB です。したがって、ファイルはそのサイズよりも小さくする必要があります。

GridFS レイヤーを介して MongoDB に 1 つの大きなサイズのファイルが保存されます。最近、GridFS のサポートが mongo_dart に追加されました。

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 に答える