🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

Node.js:用 Express 与 Multer 创建文件上传接口

最近测试小程序的接口,需要我提供一个后端服务的文件上传接口。可以使用 Node.js  创建一个这样的上传文件的接口。主要会用到 Express,Multer 这两个 Package。另外可以把上传的结果存储在数据库里,我用了一个叫 Loki 的数据库,这个数据库会在内存里运行,使用简单,速度快。

准备项目

为项目准备一个 package.json 文件。

npm init -y

安装包

npm install express multer cors --save

express 用来创建接口,multer 可以处理文件的上传,cors 可以方便的解决跨域请求问题,比如你的前端应用或者小程序要请求后端服务接口,就会有跨域问题,你得设置一些头部信息解决这个问题。

再安装一个开发依赖叫 nodemon,它会帮我们重启服务。

npm install nodemon --save-dev

文件上传

在项目下面创建一个 upload.js,可以放在 src 目录的下面。内容如下:

src/upload.js

const multer = require('multer')

const fileFilter = (request, file, callback) => {
  if (!file.originalname.match(/\.(jpg|jpeg|png|gif|mp3|mp4)$/)) {
    return callback(new Error('wrong type :)'), false)
  }
  callback(null, true)
}

const upload = multer({ dest: 'uploads/', fileFilter })

module.exports = {
 upload
}

fileFilter 是个文件上传过滤器。upload 是创建的这个上传, dest 设置了文件上传的位置。

数据库

我们可以把文件上传的结果存储在数据库。创建一个 db.js,放在 src 目录的下面。

src/db.js

const loki = require('lokijs')

const loadCollection = (collectionName, db) => {
  return new Promise(resolve => {
    db.loadDatabase({}, () => {
      const collection = db.getCollection(collectionName) || db.addCollection(collectionName)
      resolve(collection)
    })
  })
}

const db = new loki('uploads/uploads.json', { persistenceMethod: 'fs' })

module.exports = {
  loadCollection,
  db
}

loadCollection 可以为我们创建或者获取到数据库里指定的集合。db 是我们创建的数据库,它会存储在 uploads 目录的下面,名字是 uploads.json 。

接口与服务

在项目根目录下面,创建一个 index.js ,里面可以创建应用与接口。

const express    = require('express')
const cors       = require('cors')

const { loadCollection, db } = require('./db')
const { upload } = require('./upload')

const app        = express()
const router     = express.Router()

app.use(cors())

router.route('/uploads')
  .post(upload.array('uploads', 9), async (request, response, next) => {
    const collection = await loadCollection('uploads', db)
    const result = collection.insert(request.files)
    db.saveDatabase()
    response.send(
      result
    )
  })

app.use('/api', router)

app.listen(8080, () => {
  console.log('localhost:8080')
})

上面创建了一个 /uploads 接口,用 POST 方法请求 /api/uploads 的时候会用它来处理。里面的 upload.array 可以处理多个文件的上传,9 是设置的一次最大可以上传的文件数量。

package.json

打开 package.json,在 script 里面,添加一条脚本:

 "scripts": {
   "start": "./node_modules/.bin/nodemon index.js"
 },

启动

在命令行下面,执行:

npm start

测试

找一个 REST 客户端,比如 Postman 或者 Insomnia ,配置一个请求,方法是 POST,地址是 localhost:8080/api/uploads,添加一个请求主体,类型是 Multipart Form,添加一个元素,名字应该是 uploads ,类型是 file,选择一个文件,然后发送一下这个请求。会返回上传以后存储在数据库里的结果。在项目的 uploads 目录下面,你可以找到刚才上传的文件。

订阅宁皓网,学习更多 Node.js 相关课程

Node.js

评论

哇塞,搞得我又想续费了 🍻

浩哥, 在 index.js 中
const { loadCollection, db } = require('./src/db')
const { upload } = require('./src/upload')
而且 async await 低版本的node用不了

必须 Node v8 才支持

Typescript 应该能行。

有没有上传到mongodb的呀?比如GridFS之类的。谢啦 皓哥

还没有 :)不过我想以后看看实现直接把文件上传到阿里云 OSS 。

微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点