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;
}