Meteor:使用客户端上的FileReader和服务器上的Npm.require(" fs")上传图像文件

时间:2014-11-11 15:20:26

标签: javascript node.js meteor filereader fs

我在尝试使用标准<input type="file">元素将图像文件上传到公共/文件夹时遇到了一些麻烦。

所以我有此事件

      "change .logoBusinessBig-upload":function(event, template){

            var reader = new FileReader()

            reader.addEventListener("load", function(){

                Meteor.call("saveFile", reader.result)

            })

            reader.readAsArrayBuffer(event.currentTarget.files[0])

        }

当我在eventListeners回调中执行console.log(reader.result)时,我得到一个ArrayBuffer对象。

在我的server / server.js文件中,我有这个Meteor.method

        saveFile:function(file){

            var fs = Npm.require("fs")

            fs.writeFile('message.jpg', file, function (err) {

                console.log("file saved")

            });

        }

但是,文件没有保存,控制台永远不会说&#34;文件已保存&#34;。我在这做错了什么?

2 个答案:

答案 0 :(得分:7)

试试这个

// client.js

'change .logoBusinessBig-upload': function(event, template) {

    var file = event.target.files[0]; //assuming you have only 1 file
    if (!file) return;

    var reader = new FileReader(); //create a reader according to HTML5 File API

    reader.onload = function(event){          
      var buffer = new Uint8Array(reader.result) // convert to binary
      Meteor.call('saveFile',buffer);
    }

    reader.readAsArrayBuffer(file); //read the file as arraybuffer
}

//server.js

'saveFile': function(buffer){
    var fs = Npm.require("fs");
    fs.writeFile('/location',new Buffer(buffer),function(error){...});

}

<强>解释

您将文件读取为ArrayBuffer,但当前DDP无法发送,因此您将其“转换”为Uint8Array,然后是Meteor.call

在服务器上,您必须通过调用new Buffer(缓冲区)来保存它。 '/ location'不能在meteor文件夹中,因为这会触发重载,可能会将其保存到某些TmpDir

答案 1 :(得分:0)

我认为&#39; fs&#39;是本机nodejs的模块。只需尝试以这种方式要求:var fs = require('fs')