在云代码中处理上传文件

我们的云代码提供了 Web Hosting 的功能,您可以在我们的云代码上完整托管一个网站。对于一个网站应用来说,处理上传文件是很常见的需求。比如用户上传头像,上传附件等等。

同样,我们使用 express.js 框架也是支持上传文件的。现在让我们看下怎么上传一张图标,比如应用的 icon 图片。

首先,您需要对云代码有基本的了解,推荐阅读下我们的 《云代码开发指南》 中的初始配置和 web hosting 章节。

其次,您需要配置 express 框架使用 bodyParser 这个中间件,它会解析表单里的文件,并将上传文件都放到请求对象的 files 对象里:

app.use(express.bodyParser());

接下来,编写一个 html 表单放到 public 目录:

这个表单很简单,只有一个字段 iconImage,用来上传一个文件到 /upload 路径下,使用 multipart 表单 POST 提交。

接下来,我们要编写下 /upload 的处理函数,require 受限制的 fs 模块读取上传文件:

var fs = require('fs');
app.post('/upload', function(req, res){
    var iconFile = req.files.iconImage;
    if(iconFile){
        fs.readFile(iconFile.path, function(err, data){
            if(err)
                return res.send("读取文件失败");
            var base64Data = data.toString('base64');
            var theFile = new AV.File(iconFile.name, {base64: base64Data});
            theFile.save().then(function(theFile){
                res.send("上传成功!");
            });
        });
    } else {
        res.send("请选择一个文件。");
    }
});

代码非常简单,从 req.files 中得到 iconImage 文件,使用 fs.readFile 来读取这个文件的内容,并创建一个 AV.File 对象存储到 AVOS Cloud 平台,告诉客户端保存成功。

请注意,这里的 fs 模块跟 Node.js 标准库的文件模块不同,它只能用于读取上传文件,除了 readFile 方法之外都不可用。