node js 实现文件上传
实现了一个文件上传的中间件,重点引用了一个文件上传的库,multer
const express = require('express'); const router = express.Router(); const path = require('path'); const multer = require('multer'); exports.successMsg = function (msg, datas) { return { code: 200, msg: msg, datas: datas } } // 文件存入磁盘 const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, path.resolve(__dirname, './../../public/upload')) }, filename: function (req, file, cb) { const ext = path.extname(file.originalname); const fileName = Date.now() + '-' + Math.random().toString(36).slice(-6) + ext; cb(null, fileName) } }) const upload = multer({storage}); router.post('/', upload.single('img'), (req, res) => { const obj = exports.successMsg('上传成功', { url: 'upload/' + req.file.filename, }) res.status(200).send(obj); }) module.exports = router;
效果如下:
原理
get vs post : 文件上传有好多人的误区是只能用post,对于这一点来说,我个人是不太赞同的,get 和 post 都是基于http上的一种数据传输协议,而对于文件上传来说,文件本身是比较大的数据,我们在传输的时候理论上是可以使用get的,只是这么做的性价比不是最好的。
contentType: 对于文件上传来说,我们一般是使用multipart/form-data,但是我们能不能使用contentType 为 json 呢? 理论上也是可以的,我们把文件转成base64的字符串是一种方式,还有就是使用 ArrayBuffer 来装文件的二进制的数据。
文件上传multer的原理
如上图,我们可以看见文件上传的contentType 为 multipart/form-data
,里面有一个boundary(边界)
,在取数据的时候其实是通过这个边界的字符串一个一个分开的,然后在通过流的方式来进行一段一段的传输,从而获取文件或者其他的数据信息