Meteor:如何上传文件然后使用fs文件系统解压缩?

时间:2015-09-06 20:10:29

标签: javascript node.js file-upload meteor zip

如果我们使用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获得帮助,但它没有帮助。

1 个答案:

答案 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();
            }
        });
}));