头像上传

@multer

上传类型

  1. single(fieldname) - Accept a single file with the name fieldname. The single file will be stored in req.file.
  2. array(fieldname[, maxCount]) - Accept an array of files, stored in req.files
  3. fields(fields) - Accept a mix of files, stored in req.files
  4. [
      { name: 'avatar', maxCount: 1 },
      { name: 'gallery', maxCount: 8 }
    ]
  5. none() - Accept only text fields
  6. any() - Accepts all files

基本步骤

  1. 创建服务器目录
  2. 初始化
  3. 安装 multer 依赖
  4. 在服务器创建上传目录
  5. 创建服务器脚本
  6. 引入依赖
  7. 配置上传存储:推荐使用 storage 而不是 dest;如果仅仅处理文本数据,可以不指定存储
  8. 创建上传实例
  9. 响应路由
  10. 开启服务
可以在之前的资源服务器上修改并完善

single()

上传单张图片;可以同时提交数据

上传单张图片

上传单张图片接口
item desc
API接口 /upload
name image

完整流程

静态资源服务器 的基础继续开发
  1. 安装依赖
  2. npm install multer
  3. 引入 multer
  4. const multer = require('multer')
  5. 引入 path 用以解析获取文件扩展名
  6. const path = require('path')
  7. 在静态资源目录 public 中,创建上传目录 upload;上传目录要 提前 创建好;如果不指定,上传的内容将保留在内存中
  8. 配置存储 storage:指定上传目录为 upload
  9. . Multer accepts an options object, the most basic of which is the dest property, which tells Multer where to upload the files. In case you omit the options object, the files will be kept in memory and never written to disk.

    . In an average web app, only dest might be required.

    . more control over your uploads, use the storage option instead of dest.

    . 使用 diskStorage 配置可以更好控制上传细节,如改名;有了 diskStorage,可以放弃 dest 配置

    . 使用时间戳为上传图片拼接名字;存储位置和命名方式,根据实际情况定制,如也可以按照学号+姓名命名头像文件

    const storage = multer.diskStorage({
      destination: (req, file, callback) => {
        // 绝对路径,基于当前脚本文件所在目录的完整路径;更可靠,因为它不依赖于应用程序的当前工作目录
        callback(null, __dirname + '/public/upload')
        // 相对路径,相对于当前工作目录的路径
        // callback(null, "public/upload");
      },
      filename: (req, file, callback) => {
        let ext = path.extname(file.originalname)
        callback(null, file.fieldname + Date.now() + ext)
      }
    })
  10. 创建 multer 示例 - 可以看出,只需要指定一个存储即可
  11. const upload = multer({
      storage: storage
    })
  12. 定制响应路由 - name 是网络请求中为图片指定的 name 属性,即:只接收请求中 name 属性指定的图片文件;可以根据不同的 name 上传不同用途的图片,如 name 为 img 代表普通图片,为 avatar 代表头像图片等等
  13. . req.file 可以获取到具体的文件信息

    app.post('/upload', upload.single('avatar'), (req, res) => {
      res.send({
        err: 0,
        url: 'http://127.0.0.1:3000/upload/' + req.file.filename
      })
    })

    . 默认情况下,只是简单的将文件上传到指定目录;不会解析文件信息,如文件名或文件后缀

    {
      fieldname: 'avatar',
      originalname: 'XG7mQxuM7nYJ787bce43d31211e2a9fb482c28888418.png',
      encoding: '7bit',
      mimetype: 'image/png',
      destination: 'upload',
      filename: '7d9d07bdadd775e054e0e0e00fe2d444',
      path: 'upload\\7d9d07bdadd775e054e0e0e00fe2d444',
      size: 91117
    }
  14. 完整服务端代码index.js如下
  15. const express = require('express')
    const multer = require('multer')
    const path = require('path')
    
    const storage = multer.diskStorage({
      destination: (req, file, callback) => {
        callback(null, __dirname + '/public/upload')
      },
      filename: (req, file, callback) => {
        let ext = path.extname(file.originalname)
        callback(null, file.fieldname + Date.now() + ext)
      }
    })
    
    const upload = multer({
      storage: storage
    })
    
    const app = express()
    const PORT = 3000
    app.use(express.static('./public'));
    
    app.post('/upload', upload.single('avatar'), (req, res) => {
      res.send({
        err: 0,
        url: 'http://127.0.0.1:3000/upload/' + req.file.filename
      })
    })
    
    app.listen(port, () => {
      console.log(`服务器启动成功,访问地址:http://127.0.0.1:${PORT}`);
    })

上传单张图片和数据

按照学号和姓名命名图片
item desc
API接口 /upload/avatar
图片 avatar
学号 usn
姓名 uname
[] 原生HTML开发,需要显式的指定表单 enctype 为 multipart/form-data
[] 封装 multer 为 upload.js

none()

应用三、提交表单数据 none()

array()

应用四、上传多个图片 array()

fields()

应用五、上传多个图片 fields()