使用express搭建文件上传服务器遇到的坑

使用express搭建文件上传服务器遇到的坑

四月 11, 2017

说明

最近需要做一个文件上传的功能,但后台还没给API,所以想先用express.js先搭建一个本地文件上传服务器先把功能实现了。实际操作中,发现node.js实现文件上传服务器还有不少坑。所以写篇文章想记下遇到的问题和自己的理解,以备后患。

我用到的工具是formidable@1.1.1,网上可能更多的推荐是multer,但是按教程操作res.fileres.files始终是undefined,索性改用formidable

还有一种说法express 4.X也已经直接支持文件上传文章见Cnode,但是我未能实现,暂时用formidable实现,以后有新发现再回头修改。

formidable github首页

github/node-formidable

详细说明

安装formidable

1
npm install formidable --save

引入formidable

1
const formidable = require('formidable')

初始化formidable

1
let form = new formidable.IncomingForm();

然后用formidable实例对象form去解析express的req对象

1
2
3
4
5
6
app.all('/upload', (req, res) => {
form.parse(req, (err, fields, files) => {
//fields包含上传的文本信息对象
//files包含上传的文件对象
});
}

需要注意的是,上传的文件会默认保存在系统临时目录里(可以用os.tmpdir()获取),完整文件路径保存在files对象对应文件对象的path参数中。

然后再重命名一下临时文件和删除掉临时文件即可。

1
2
3
4
5
6
7
8
Object.keys(files).forEach((v, i) => {
try{
fs.writeFileSync('./upload/' + files[v].name, fs.readFileSync(files[v].path))
fs.unlinkSync(files[v].path)
}catch(e) {
console.warn(e)
}
})

关于客户端上传,见下一篇文章