ファイルアップロードフィールドから Objectory/Dart を使用してバイナリファイルを Mongodb に保存する方法は?
1 に答える
実際、あなたの質問には多くのレベルで多くの意味があります。基本的に 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();
});
}