Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor:在客户端使用FileReader和在服务器上使用Npm.require(“fs”)上载图像文件_Javascript_Node.js_Meteor_Filereader_Fs - Fatal编程技术网

Javascript Meteor:在客户端使用FileReader和在服务器上使用Npm.require(“fs”)上载图像文件

Javascript Meteor:在客户端使用FileReader和在服务器上使用Npm.require(“fs”)上载图像文件,javascript,node.js,meteor,filereader,fs,Javascript,Node.js,Meteor,Filereader,Fs,我在尝试使用标准元素将图像文件上载到公用文件夹时遇到问题 所以我有了这件事: "change .logoBusinessBig-upload":function(event, template){ var reader = new FileReader() reader.addEventListener("load", function(){ Meteor.call("saveFile", read

我在尝试使用标准
元素将图像文件上载到公用文件夹时遇到问题

所以我有了这件事:

      "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])

        }
        saveFile:function(file){

            var fs = Npm.require("fs")

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

                console.log("file saved")

            });

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

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

      "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])

        }
        saveFile:function(file){

            var fs = Npm.require("fs")

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

                console.log("file saved")

            });

        }

但是,文件不会被保存,控制台也不会说“文件已保存”。我在这里做错了什么?

我认为“fs”是一个本地nodejs模块。简单地试着这样要求它:
var fs=require('fs')
试试这个

//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


在服务器上,您必须通过调用newbuffer(Buffer)来保存它来转换它。“/location”不能在meteor文件夹中,因为这将触发重新加载,可能会将其保存到某个TmpDir中

如果我更改它,则会出现以下错误:调用方法“saveFile”时出错:内部服务器错误[500]。请尝试Npm.require('fs')控制台会显示“文件已保存”。。。我在浏览我的浏览器控制台,而不是mac控制台。。