meteor CollectionFS 小文件上传进度条
Upload progress bar for small files in meteor CollectionFS
使用 meteor-cfs-ui
软件包,您可以显示上传文件的进度条。但这只适用于大于 2 MB 的文件。如果文件较小,则条形图会从 0% 跳到 100%。
Here 我找到了一个解决方案,它使用了这个代码:
if(fsFile.original.size < (2097152)*10) {
var chunkSize = fsFile.original.size / 10;
FS.config.uploadChunkSize = chunkSize;
}
uploadFile(fsFile, fullFileName, projectId);
但是我必须将该代码放在哪里?
我这样声明我的店铺:
Images = new FS.Collection("images", {
stores: [
new FS.Store.FileSystem("something", {
transformWrite: function (fileObj, readStream, writeStream) {
// do transformations
}
})]
});
上传是这样完成的:
FS.Utility.eachFile(event, function (file) {
var newFile = new FS.File(file);
newFile.uploadedFrom = Meteor.userId();
data = Images.insert(newFile, function (error, fileObject) {});
});
所以我想这是一个愚蠢的问题,但我真的不明白,把代码放在哪里...
上传是在集合插入时进行的,因此您应该能够在此之前设置chunkSize
:
FS.Utility.eachFile(event, function (file) {
var newFile = new FS.File(file);
newFile.uploadedFrom = Meteor.userId();
var maxChunk = 2097152;
FS.config.uploadChunkSize =
( newFile.original.size < 10*maxChunk ) ? newFile.original.size/10 : maxChunk;
data = Images.insert(newFile, function (error, fileObject) {});
});
此外,如果您使用的是 FS.EventHandlers.insertFiles
并且没有看到加载栏,请在您的客户端代码中创建此函数:
/**
* Replace for original FS.EventHandlers.insertFiles function.
*/
function cfsInsertFiles(collection, options) {
options = options || {};
var afterCallback = options.after;
var metadataCallback = options.metadata;
function insertFilesHandler(event) {
FS.Utility.eachFile(event, function (file) {
var f = new FS.File(file);
var maxChunk = 2097152;
FS.config.uploadChunkSize =
(f.original.size < 10 * maxChunk) ? f.original.size / 10 : maxChunk;
if (metadataCallback) {
FS.Utility.extend(f, metadataCallback(f));
}
collection.insert(f, afterCallback);
});
}
return insertFilesHandler;
}
最后改用它 FS.EventHandlers.insertFiles
。例如:
Template.files.events({
'dropped .imageArea': cfsInsertFiles(Images, {
metadata: function (fileObj) {
return {
owner: Meteor.userId(),
foo: "bar"
};
},
after: function (error, fileObj) {
console.log("Inserted", fileObj.name);
}
})
});
使用 meteor-cfs-ui
软件包,您可以显示上传文件的进度条。但这只适用于大于 2 MB 的文件。如果文件较小,则条形图会从 0% 跳到 100%。
Here 我找到了一个解决方案,它使用了这个代码:
if(fsFile.original.size < (2097152)*10) {
var chunkSize = fsFile.original.size / 10;
FS.config.uploadChunkSize = chunkSize;
}
uploadFile(fsFile, fullFileName, projectId);
但是我必须将该代码放在哪里?
我这样声明我的店铺:
Images = new FS.Collection("images", {
stores: [
new FS.Store.FileSystem("something", {
transformWrite: function (fileObj, readStream, writeStream) {
// do transformations
}
})]
});
上传是这样完成的:
FS.Utility.eachFile(event, function (file) {
var newFile = new FS.File(file);
newFile.uploadedFrom = Meteor.userId();
data = Images.insert(newFile, function (error, fileObject) {});
});
所以我想这是一个愚蠢的问题,但我真的不明白,把代码放在哪里...
上传是在集合插入时进行的,因此您应该能够在此之前设置chunkSize
:
FS.Utility.eachFile(event, function (file) {
var newFile = new FS.File(file);
newFile.uploadedFrom = Meteor.userId();
var maxChunk = 2097152;
FS.config.uploadChunkSize =
( newFile.original.size < 10*maxChunk ) ? newFile.original.size/10 : maxChunk;
data = Images.insert(newFile, function (error, fileObject) {});
});
此外,如果您使用的是 FS.EventHandlers.insertFiles
并且没有看到加载栏,请在您的客户端代码中创建此函数:
/**
* Replace for original FS.EventHandlers.insertFiles function.
*/
function cfsInsertFiles(collection, options) {
options = options || {};
var afterCallback = options.after;
var metadataCallback = options.metadata;
function insertFilesHandler(event) {
FS.Utility.eachFile(event, function (file) {
var f = new FS.File(file);
var maxChunk = 2097152;
FS.config.uploadChunkSize =
(f.original.size < 10 * maxChunk) ? f.original.size / 10 : maxChunk;
if (metadataCallback) {
FS.Utility.extend(f, metadataCallback(f));
}
collection.insert(f, afterCallback);
});
}
return insertFilesHandler;
}
最后改用它 FS.EventHandlers.insertFiles
。例如:
Template.files.events({
'dropped .imageArea': cfsInsertFiles(Images, {
metadata: function (fileObj) {
return {
owner: Meteor.userId(),
foo: "bar"
};
},
after: function (error, fileObj) {
console.log("Inserted", fileObj.name);
}
})
});