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

kev*_*ius 4 javascript filereader fs node.js meteor

我在尝试使用标准<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])

        }
Run Code Online (Sandbox Code Playgroud)

当我在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")

            });

        }
Run Code Online (Sandbox Code Playgroud)

但是,文件没有保存,控制台永远不会显示"文件已保存".我在这做错了什么?

Gre*_*een 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){...});

}
Run Code Online (Sandbox Code Playgroud)

说明

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

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