nodejs中上传文件使用formidable对于一个nodejs后端开发者来说非常常见,从npm库里面的下载量和githubs上的star数就可以看出这个模块上传功能的火热。
使用formidable的好处
快速(~500MB /秒)自动书写到磁盘
低内存占用
错误处理
很高的测试覆盖率
安装
npm install formidable@latest
使用
1.表单
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8"/>
<head>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="text" name="file1"/>
<input type="text" name="file2"/>
<input type="file" name="file"/>
<input type="file" name="file4"/>
<input type="submit" value="Upload File"/>
</form>
</body>
</html>
2.route
var upload = require('./upload');
router.get('/upload', upload.upLoadGet);
router.post('/upload', upload.upLoadPost);
3.操作
var querystring = require('querystring'), fs = require('fs'); var formidable = require('formidable'), http = require('http'), util = require('util'); module.exports.upLoadGet = function (req, res) { res.render('upload', { title: '文件上传', success: req.flash('success').toString(), error: req.flash('error').toString() }); }; module.exports.upLoadPost = function (req, res) { var form = new formidable.IncomingForm();form.uploadDir = "./public"; var response; form.parse(req, function (error, fields, files) { var file = files.file; var dir = path.join(__dirname, "../../test/a.jpg"); var target_path = dir; try { fs.rename(file.path, target_path, function (err) { if (err) { console.log(err) response = { url: "" }; res.end(JSON.stringify(response)); } else { console.log("上传成功"); response = { url: target_path }; res.end(JSON.stringify(response)); } }); } catch (e) { console.log(e); response = { url: "" }; res.end(JSON.stringify(response)); } }); };