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") 上传图像文件的主要内容,如果未能解决你的问题,请参考以下文章

使用流星列出客户端上的所有用户

如何在 Meteor React 中加密和解密客户端上的数据?

Meteor 为数千个并发用户提供服务器端内存使用情况

如何在流星内访问客户端上的服务器聚合

如何使 Meteor 方法同步?

在 Meteor 中如何有条件地向客户端发送数据?