• node+express+multer实现单个或多个图片文件,视频文件上传


    一.multer

    官方介绍:

    Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上非常高效。

    中文官方网址:

    multer/README-zh-cn.md at master · expressjs/multer · GitHub

    怎么使用就不介绍了,官方文档很详细

    二、使用

     1.单个文件(图片或视频都可以)上传

    前端代码:

    <input type="file" ref="file1" @change="fileChange1"/>

    自己封装的向后端发送请求的函数:

    1. // 导入自己封装的axios请求实例
    2. import request from '../tools/request'
    3. export const addArticle = data => {
    4. return request({
    5. method: 'post',
    6. url: '/my/addActicle',
    7. // url: '/my/addActicle2',
    8. // url: '/my/addActicle3',
    9. headers: {
    10. 'Content-Type': 'multipart/form-data'
    11. },
    12. data
    13. })
    14. }

    vue代码:

    1. <script>
    2. //导入自己向后端发送请求的函数
    3. import { addArticle } from '../../request/article'
    4. export default {
    5. data() {
    6. return {
    7. article: {
    8. title: '文章标题',
    9. cate_id: 1,
    10. content: '这是文章内容测试',
    11. state: '草稿'
    12. }
    13. }
    14. },
    15. methods: {
    16. async fileChange1() {
    17. //读取文件对象,并基于文件对象获取blob数据
    18. const file = this.$refs.file1.files[0]
    19. //为对象添加cover_img属性用来保存文件
    20. this.article.cover_img = file
    21. //向后端发送请求
    22. await addArticle(this.article)
    23. }
    24. }
    25. }
    26. script>

    浏览器查看自己的发送参数:

     

     

    后端路由代码:

    1. const multer = require('multer')
    2. //创建multer的实例对象,通过dest属性指定文件的存放路径
    3. const upload = multer({ dest: path.join(__dirname, '../uploads') })
    4. //'cover_img'为前端存储文件的属性名,必须一致
    5. router.post('/addActicle', upload.single('cover_img'), addActicle)

    自己封装的将后端接收到文件保存文件夹中:

    1. //文章路由处理函数
    2. const fs = require('fs')
    3. const path = require('path')
    4. function saveImg(file, sign) {
    5. return new Promise((resolve, reject) => {
    6. fs.readFile(file.path, async (err, data) => {
    7. if (err) {
    8. reject(err)
    9. }
    10. // 拓展名
    11. let extName = file.mimetype.split('/')[1]
    12. // 拼接成图片名
    13. // 这里可以自行修改
    14. let imgName = `${sign}-${Date.now()}.${extName}`
    15. // 写入图片
    16. // 写入自己想要存入的地址
    17. await fs.writeFile(path.join(__dirname, `../upload/${imgName}`), data, err => {
    18. //写入失败
    19. if (err) { reject(err) }
    20. //写入成功,同时返回需要存储在数据中的相对路径
    21. resolve(`/upload/${imgName}`)
    22. })
    23. // 删除二进制文件
    24. await fs.unlink(file.path, err => {
    25. if (err) { reject(err) }
    26. })
    27. })
    28. })
    29. }

    后端路由处理函数代码:

    1. exports.addActicle = (req, res) => {
    2. // console.log(req.body);//文本类型的数据
    3. // console.log(req.file);//文件类型的数据
    4. let file = req.file
    5. console.log('通过multer解析文件信息对象', file);
    6. saveImg(file, req.user.username).then(res => {
    7. // res就是我返回的相对地址的位置
    8. console.log(res);
    9. }).catch(err => {
    10. // 啊....啊 最苦恼的bug环节
    11. console.log(err);
    12. })
    13. }

    后端接收成功:

     

    2.多个文件(图片或视频都可以)上传 (需要使用FormData来存储表单数据)

    第一种方式

    前端代码:

    <input type="file" ref="file1" @change="fileChange1" multiple />

    自己封装的向后端发送请求的函数:

    1. // 导入自己封装的axios请求实例
    2. import request from '../tools/request'
    3. export const addArticle = data => {
    4. return request({
    5. method: 'post',
    6. //url: '/my/addActicle',
    7. url: '/my/addActicle2',
    8. // url: '/my/addActicle3',
    9. headers: {
    10. 'Content-Type': 'multipart/form-data'
    11. },
    12. data
    13. })
    14. }

    vue代码:

    1. <script>
    2. import { addArticle } from '../../request/article'
    3. export default {
    4. data() {
    5. return {
    6. }
    7. },
    8. methods: {
    9. async fileChange1() {
    10. //读取文件对象,并基于文件对象获取blob数据
    11. const files = this.$refs.file1.files
    12. const form = new FormData()
    13. for (const item of files) {
    14. form.append('cover_img', item)
    15. }
    16. form.append('test', 1)
    17. await addArticle(form)
    18. }
    19. }
    20. }
    21. script>

    浏览器查看自己的发送参数:

     

    后端路由代码:

    1. const multer = require('multer')
    2. //创建multer的实例对象,通过dest属性指定文件的存放路径
    3. const upload = multer({ dest: path.join(__dirname, '../uploads') })
    4. //'cover_img'为前端存储文件的属性名,必须一致
    5. router.post('/addActicle2', upload.array('cover_img', 3), addActicle2)

    后端路由处理函数代码:

    1. exports.addActicle2 = (req, res) => {
    2. // console.log('通过token解析出来的用户信息对象', req.user);
    3. console.log('通过multer解析表单的文本类型数据', req.body);
    4. let files = req.files
    5. console.log('通过multer解析表单的文件类型数据', files);
    6. }

    后端接收成功:

     

    第二种方式

    前端代码:

    1. <input type="file" ref="file1" @change="fileChange1" multiple />
    2. <input type="file" ref="file2" @change="fileChange2" multiple />
    3. <button @click="addArticle">上传</button>

    自己封装的向后端发送请求的函数:

    1. // 导入自己封装的axios请求实例
    2. import request from '../tools/request'
    3. export const addArticle = data => {
    4. return request({
    5. method: 'post',
    6. //url: '/my/addActicle',
    7. //url: '/my/addActicle2',
    8. url: '/my/addActicle3',
    9. headers: {
    10. 'Content-Type': 'multipart/form-data'
    11. },
    12. data
    13. })
    14. }

    vue代码:

    1. <script>
    2. import { addArticle } from '../../request/article'
    3. export default {
    4. data() {
    5. return {
    6. form: new FormData()
    7. }
    8. },
    9. methods: {
    10. async fileChange1() {
    11. //读取文件对象,并基于文件对象获取blob数据
    12. const file = this.$refs.file1.files[0]
    13. this.form.append('cover_img', file)
    14. this.form.append('test', 1)
    15. },
    16. async fileChange2() {
    17. const file = this.$refs.file2.files[0]
    18. this.form.append('avatar', file)
    19. },
    20. async addArticle() {
    21. await addArticle(this.form)
    22. }
    23. }
    24. }
    25. script>>

    浏览器查看自己的发送参数:

     

    后端路由代码:

    1. const multer = require('multer')
    2. //创建multer的实例对象,通过dest属性指定文件的存放路径
    3. const upload = multer({ dest: path.join(__dirname, '../uploads') })
    4. router.post('/addActicle3', upload.fields([{ name: 'cover_img', maxCount: 3 }, { name: 'avatar', maxCount: 2 }]), addActicle3)

    后端路由处理函数代码:

    1. exports.addActicle3 = (req, res) => {
    2. console.log('通过token解析出来的用户信息对象', req.user);
    3. console.log('通过multer解析表单的文本类型数据', req.body);
    4. let files = req.files
    5. console.log('通过multer解析表单的文件类型数据', files);
    6. }

    后端接收成功:

     

  • 相关阅读:
    九、T100应付管理之应付期末账务处理
    Python3教程:functools模块的用法
    字符串转换整数(around)
    典型技术赋能供应链金融全周期示意图
    这个Python库助力pandas智能可视化分析
    NOI / 1.6编程基础之一维数组(2)
    图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测
    ApplicationContextAware、ApplicationContext
    ETH开源PPO算法学习
    ptmalloc源码分析 - malloc/free函数的实战篇(12)
  • 原文地址:https://blog.csdn.net/h18377528386/article/details/126353760