GridIn class
class GridIn extends GridFSFile { Stream<List<int>> input; bool savedChunks = false; int currentChunkNumber = 0; int currentBufferPosition = 0; int totalBytes = 0; ObjectId id; GridFS fs; String filename; MD5 messageDigester; GridIn(this.fs, [String filename = null, Stream<List<int>> inputStream = null]) { id = new ObjectId(); chunkSize = GridFS.DEFAULT_CHUNKSIZE; input = inputStream.transform(new ChunkHandler(chunkSize).transformer); uploadDate = new DateTime.now(); messageDigester = new MD5(); this.filename = filename; } Future save([int chunkSize]) { if (chunkSize == null) { chunkSize = this.chunkSize; } Future result; if (!savedChunks) { result = saveChunks(chunkSize); } else { result = new Future.value({'ok': 1.0}); } return result; } Future<Map> saveChunks([int chunkSize = 0]) { List<Future> futures = new List(); Completer completer = new Completer(); _onDone() { Future.wait(futures).then((list) { return finishData(); }).then((map){ completer.complete({}); }); } if (chunkSize == null) { chunkSize = this.chunkSize; } if (savedChunks) { throw new MongoDartError('chunks already saved!'); } if (chunkSize <= 0 || chunkSize > GridFS.MAX_CHUNKSIZE) { throw new MongoDartError('chunkSize must be greater than zero and less than or equal to GridFS.MAX_CHUNKSIZE'); } input.listen((data) { futures.add(dumpBuffer(data)); }, onDone: _onDone); return completer.future; } // TODO(tsander): OutputStream?? Future<Map> dumpBuffer( List<int> writeBuffer ) { if (writeBuffer.length == 0) { // Chunk is empty, may be last chunk return new Future.value({}); } Map chunk = {"files_id" : id, "n" : currentChunkNumber, "data": new BsonBinary.from(writeBuffer)}; currentChunkNumber++; totalBytes += writeBuffer.length; messageDigester.add(writeBuffer); currentBufferPosition = 0; return fs.chunks.insert(chunk); } Future finishData() { if (!savedChunks) { md5 = CryptoUtils.bytesToHex(messageDigester.close()); length = totalBytes; savedChunks = true; } return super.save(); } }
Extends
GridFSFile > GridIn
Constructors
new GridIn(GridFS fs, [String filename = null, Stream<List<int>> inputStream = null]) #
Creates a new Object instance.
Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.
docs inherited from Object
GridIn(this.fs, [String filename = null, Stream<List<int>> inputStream = null]) { id = new ObjectId(); chunkSize = GridFS.DEFAULT_CHUNKSIZE; input = inputStream.transform(new ChunkHandler(chunkSize).transformer); uploadDate = new DateTime.now(); messageDigester = new MD5(); this.filename = filename; }
Properties
final List<String> aliases #
inherited from GridFSFile
List<String> get aliases { return extraData["aliases"]; }
Map data #
inherited from GridFSFile
Map get data { Map result = { "_id" : id, "filename" : filename, "contentType" : contentType, "length" : length, "chunkSize" : chunkSize, "uploadDate" : uploadDate, "md5" : md5, }; extraData.forEach((String key, Object value) { result[key] = value; }); return result; }
set data(Map input) { extraData = new Map.from(input); // Remove the known keys. Leaving the extraData. id = extraData.remove("_id"); filename = extraData.remove("filename"); contentType = extraData.remove("contentType"); length = extraData.remove("length"); chunkSize = extraData.remove("chunkSize"); uploadDate = extraData.remove("uploadDate"); md5 = extraData.remove("md5"); }
Map metaData #
inherited from GridFSFile
Map get metaData { return extraData["metadata"]; }
set metaData(Map metaData) { extraData["metadata"] = metaData; }
Methods
Future<Map> dumpBuffer(List<int> writeBuffer) #
Future<Map> dumpBuffer( List<int> writeBuffer ) { if (writeBuffer.length == 0) { // Chunk is empty, may be last chunk return new Future.value({}); } Map chunk = {"files_id" : id, "n" : currentChunkNumber, "data": new BsonBinary.from(writeBuffer)}; currentChunkNumber++; totalBytes += writeBuffer.length; messageDigester.add(writeBuffer); currentBufferPosition = 0; return fs.chunks.insert(chunk); }
Future finishData() #
Future finishData() { if (!savedChunks) { md5 = CryptoUtils.bytesToHex(messageDigester.close()); length = totalBytes; savedChunks = true; } return super.save(); }
int numChunks() #
inherited from GridFSFile
int numChunks() { return (length.toDouble() / chunkSize).ceil().toInt(); }
Future save([int chunkSize]) #
Future save([int chunkSize]) { if (chunkSize == null) { chunkSize = this.chunkSize; } Future result; if (!savedChunks) { result = saveChunks(chunkSize); } else { result = new Future.value({'ok': 1.0}); } return result; }
Future<Map> saveChunks([int chunkSize = 0]) #
Future<Map> saveChunks([int chunkSize = 0]) { List<Future> futures = new List(); Completer completer = new Completer(); _onDone() { Future.wait(futures).then((list) { return finishData(); }).then((map){ completer.complete({}); }); } if (chunkSize == null) { chunkSize = this.chunkSize; } if (savedChunks) { throw new MongoDartError('chunks already saved!'); } if (chunkSize <= 0 || chunkSize > GridFS.MAX_CHUNKSIZE) { throw new MongoDartError('chunkSize must be greater than zero and less than or equal to GridFS.MAX_CHUNKSIZE'); } input.listen((data) { futures.add(dumpBuffer(data)); }, onDone: _onDone); return completer.future; }
Future<bool> validate() #
inherited from GridFSFile
Future<bool> validate() { if (fs == null) { throw new MongoDartError('no fs'); } if (md5 == null) { throw new MongoDartError('no md5 stored'); } Completer completer = new Completer(); // query for md5 at filemd5 DbCommand dbCommand = new DbCommand( fs.database,fs.bucketName,0,0,1,{"filemd5" : id}, {"md5" : 1}); fs.database.executeDbCommand(dbCommand).then((Map data) { if (data != null && data.containsKey("md5")) { completer.complete(md5 == data["md5"]); } else { completer.complete(false); } }); return completer.future; }