2012-11-07 46 views

回答

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)其效率高,而且只能用飛鏢工作:IO(服務器端) 對於基於對象工廠目前你可以使用名爲constructor BsonBinary.fromHexString()瀏覽器。我恐怕這會產生重大的開銷。

另一個考慮因素是對MongoDB中文檔總大小的限制,即16mb。所以你的文件必須小於這個尺寸。

通過GridFS層在MongoDB中存儲更大容量的文件,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(); 
    }); 
} 
+1

看來mongo_dart現在支持至少的文件塊部分GridFS的https://github.com/vadimtsushko/mongo_dart/blob/master/doc/feature_checklist.md但沒有看到如何使用它的任何例子。 – Delaney

+1

謝謝德萊尼,我已經更新了答案並添加了GridFS示例 –

相關問題