我在尝试使用标准<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;。我在这做错了什么?
答案 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')