Meteor:使用客户端上的 FileReader 和服务器上的 Npm.require("fs") 上传图像文件
Posted
技术标签:
【中文标题】Meteor:使用客户端上的 FileReader 和服务器上的 Npm.require("fs") 上传图像文件【英文标题】:Meteor: upload image file using FileReader on client and Npm.require("fs") on server 【发布时间】:2015-01-08 04:43:48 【问题描述】:我在尝试使用标准 <input type="file">
元素将图像文件上传到我的 public/ 文件夹时遇到了一些问题。
所以我有这个活动:
"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")
);
但是,文件没有被保存,并且控制台从来没有说“文件已保存”。我在这里做错了什么?
【问题讨论】:
控制台确实说“文件已保存”...我正在查看我的浏览器控制台而不是我的 mac 控制台.. 【参考方案1】:试试这个
//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(buffer) 来转换它来保存它。 '/location' 不能在流星文件夹中,因为这会触发重新加载,可能会将其保存到某个 TmpDir
【讨论】:
【参考方案2】:我认为'fs' 是原生 nodejs 的模块。只需尝试以这种方式要求它:var fs = require('fs')
【讨论】:
如果我改变它我得到这个错误:错误调用方法'saveFile':内部服务器错误[500]。 试试 Npm.require('fs')以上是关于Meteor:使用客户端上的 FileReader 和服务器上的 Npm.require("fs") 上传图像文件的主要内容,如果未能解决你的问题,请参考以下文章