node编写上传文件的接口
前期写的接口一直都是往服务器里面传数据,第一次往服务器写图片文件,和普通的node接口还有一定的区别,而且用postman测试与常规接口的方法也不一致,记录一下,便于后续编写接口
node接口
先直接上代码,再解释下代码实现的逻辑
const express = require('express');
const router = express.Router();
// 上传图片接口
const fs = require('fs');
const multer = require('multer')
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, './uploads')
},
filename: (req, file, cb) => {
cb(null, Date.now() + file.originalname)
}
})
const createFolder = folder => {
try {
fs.accessSync(folder)
} catch (err) {
fs.mkdirSync(folder)
}
}
const uploadFolder = './uploads/'
createFolder(uploadFolder)
const upload = multer({
storage
})
router.post('/upload', upload.single('file'), (req, res) => {
const file = req.file
console.log('文件类型: %s', file.mimeType)
console.log('原始文件名: $s', file.originalname)
console.log('文件大小: %s', file.size)
console.log('文件保存路径: %s', file.path)
res.json({
res_code: 0,
name: file.originalname,
url: file.url
})
})
module.exports = router
-
const storage
用来设置文件的存放路径,其中destination是文件的目标路径,就是说通过这个接口,上传后会把数据上传到./uploads这个相对路径之下,这里的路径我还有点没搞明白,因为./uploads只有一个点,而我这个接口文件并不在根目录下,我设定的路径是根目录下创建一个upload文件夹,用来存放上传的数据,所以我以为正确的写法应该是…/uploads,结果它在我的根目录外面一层目录下创建了这个upload文件夹,所以我只能理解为这个相对路径相对的是根目录(不知道理解上是否有偏差),下面是我的文件结构:上面的代码写在router文件夹下的路由文件中,最后生成的uploads文件夹却在api根目录下,这里理解还有点不到位api:.
├─db
├─router
├─router_handle
├─up
└─uploads -
const createFolder
创建文件夹过程 -
const upload
是在创建一个multer对象,并把第一步定义的storage传参进去 -
后面就是写post请求了,本来我是写的分布式接口处理,即路由处理函数写在router_handle文件夹下的路由处理文件中,但这里post请求时传递了第三步定义的upload对象,有点混乱,就没写分布式路由了,直接写在路由文件中
postman测试接口
文件上传的测试还有点麻烦,流程如下
-
输入post请求的地址
-
设置请求头,必须按图中设置
-
设置请求体 body->form-data,按图中去设置,注意,第0步中的key值必须与接口请求中的
router.post('/upload', upload.single('file')
括号里的名称保持一致,否则会报错
-
点击send即可发生数据
.