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控制台。。