如果我们使用CFS for meteor在线上传大文件,当存储(不上传)完成时我们必须触发另一个事件,比如解压缩文件,那么我们将如何做呢? isUpload在这种情况下是不合适的,因为文件尚未存储,因此解压缩不起作用。在客户端这样写是什么意思。
JavaScript的:
var Zipper = new FS.Collection("zip", {
stores: [new FS.Store.FileSystem("zip")]
});
if (Meteor.isClient) {
Template.upload.helpers({
'data':function(){
return Zipper.find();
}
});
Template.upload.events({
'change #fileUpload': function (event,template) {
FS.Utility.eachFile(event,function(file) {
var fileObj = new FS.File(file);
var fileId;
Zipper.insert(fileObj,function(err){
});
})
}
});
}
if (Meteor.isServer) {
Meteor.methods({
"unZipFile":function(fileId, fileName){
//unzip the file using node package
}
});
}
HTML:
<head>
<title>uploadAndZip</title>
</head>
<body>
<div class="container">
<h1>Welcome to Meteor!</h1>
{{> upload}}
</div>
</body>
<template name="upload">
<input type="file" id="fileUpload">
{{#each data}}
{{#unless this.isUploaded}}
{{> FS.UploadProgressBar bootstrap=true}}
{{/unless}}
{{/each}}
<table class="table table-striped table-hover ">
<thead>
<tr>
<th>Name</th>
<th>Size</th>
<th>Date</th>
</tr>
</thead>
<tbody>
{{#each data}}
<tr class="success">
<td>{{name}}</td>
<td>{{size}} bytes</td>
<td>{{updatedAt}}</td>
</tr>
{{/each}}
</tbody>
</table>
</template>
我试图从This post获得帮助,但它没有帮助。
答案 0 :(得分:0)
我使用nodejs unzip和package解决了类似的问题:meteorhacks:npm。 使用存储时不需要方法,上传zip时将执行功能。
在这种情况下,我只提取tif(f)和jpeg。
Zips.on('stored', Meteor.bindEnvironment(function (fileObj) {
var unzip = Meteor.npmRequire('unzip');
var fs = Meteor.npmRequire('fs');
fs.createReadStream(Meteor.settings.public.zipFolder+fileObj.copies.zip.key)
.pipe(unzip.Parse())
.on('entry', function (entry) {
var fileName = entry.path;
var type = entry.type; // 'Directory' or 'File'
var size = entry.size;
if (fileName.match(/(.tif+|.jpg|.jpeg)$/)) {
console.log("extracting file: "+fileName);
entry.pipe(fs.createWriteStream('/tmp/'+fileName));
} else {
entry.autodrain();
}
});
}));