首页 > 其他分享 >文件上传

文件上传

时间:2023-05-19 10:57:21浏览次数:31  
标签:username 文件 const req multer file 上传 avatar

文件上传 multer

  1. 安装
npm i multer
  1. 引入
const multer = require('multer')
  1. 使用
    这里给出一个 form 表单案例的使用:
  • 表单
// 表单的类型 必须是 multipart/form-data
<form action="/upload" enctype="multipart/form-data" method="post">
    姓名:<input type="text" name="username"><br>
    // 上传文件时 input 表单类型必须是 type
    头像:<input type="file" name="avatar"><br>
    <button type="submit">提交</button>
</form>
  • 如果使用的是点击上传
// 点击事件
btn.addEventListener('click', () => {
    // 要处理成表单对象上传
    const formsdata = new FormData();
    formsdata.append('username', username.value);
    formsdata.append('password', password.value);
    // 追加name值,和文件对象
    formsdata.append('avatar', avatar.files[0]);

    axios.post('/user/upload/avatar', formsdata, {
        headers: {
          'Content-Type': 'multipart/form-data',
        },
    }).then(res => {
      document.querySelector('img').src = res.data.imgPath;
    });
  });
// 后端
const express = require('express')
const router = express.Router()
const multer = require('multer')
const UserModel = require('../../models/UserModles')
// const uplaoder = multer('public/uploads')
// 如果要添加保存时的文件后缀和文件路径,需要添加如下配置
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        // 文件存放路径
        cb(null, 'public/uploads')
    },
    filename: function (req, file, cb) {
        // console.log(file) // 打印出 file,其中有一个 originalname 就是上传文件的完整名字,从而进行拼接
        cb(null, file.fieldname + '-' + Date.now() + '.' + file.originalname.split('.')[1])
    }
})
/* file:{
  fieldname: 'avatar',
  originalname: 'h1.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg'
} */
const uplaoder = multer({ storage })

// uploader.single('avatar') 其中 avatar 必须和前端 input 的 name 一致
router.post('/upload', uplaoder.single('avatar'), (req, res) => {
    // console.log(req.files, req.body)
    UserModel.findOne({ username: req.body.username }).then(data => {
        UserModel.updateOne({ username: data.username }, { file: `/uploads/${req.file.filename}` }).then(data => {
            res.send('ok')
        })
    }).catch(err => {
        res.send(err)
    })
})
  • 批量上传
// 表单:
头像:<input type="file" name="avatar" multiple><br>

// 后端:
// uploader.array('avatar',文件上传的数量)
router.post('/upload', uplaoder.array('avatar', 12), (req, res) => {
    console.log(req.files, req.body)
    let files = req.files.map(file => {
        return `/uploads/${file.filename}`
    })
    UserModel.findOne({ username: req.body.username }).then(data => {
        UserModel.updateOne({ username: data.username }, { file: files.toString() }).then(data => {
            res.send('ok')
        })
    }).catch(err => {
        res.send(err)
    })
})
  • 限制文件类型
// 在 multer.diskStorage 内:
destination: function(req, file, cb) {
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype==='image/gif') {
      cb(null, 'public/uploads'))
    } else {
      cb({ error: '仅支持 jpg/png/gif 格式的图片!' })
    }
  },
  • 限制文件上传大小
const multerConfig = multer({
  storage: storage,
  limits: { fileSize: 1024 * 1024 * 2 } // 2M
})

标签:username,文件,const,req,multer,file,上传,avatar
From: https://www.cnblogs.com/wj-goodgoodstudy/p/17414259.html

相关文章

  • 合并两个文件夹下名称交集的标签
    标签为黑白图,合并两个文件夹下名称交集的标签 1#合并两个文件夹下相同名称的两张png标签2#3#开发时间:2023/5/1816:384importos56fromPILimportImage78defmerge(path1,path2,path3):9#打开第一张图片10img1=Image.open(path1......
  • 投标文件--技术标 反馈及编写顺序
    一问题反馈:1.原来写过的投标文档,整体内容适当变一变,不要原封不动,适当组合组合2.技术指标--拿出一个大的章节放到突出位置二编写顺序参照投标文件搜索找到关键字‘技术标’相关字眼找到‘投标人须知前附表’找到‘投标文件格式要求’看一遍上面这些要求,如果格式要......
  • Golang -embed结合viper打包静态文件
    代码含有viper独立方式和goembed方式packagemainimport("bytes""embed""fmt""time""github.com/spf13/viper")//go:embedconfig.yamlvarf[]bytefuncmain(){//config:=viper.New()......
  • Gwt 文件
    publicvoidonModuleLoad(){finalFormPanelform=newFormPanel();form.setAction("/upload");form.setEncoding(FormPanel.ENCODING_MULTIPART);form.setMethod(FormPanel.METHOD_POST);VerticalPanelpanel=......
  • # yyds干货盘点 # 使用Python复制某文件夹下子文件夹名为"数据"文件夹下的所有以"DD"
    大家好,我是皮皮。一、前言前几天在Python最强王者群【魏哥】问了一个Python自动化办公处理的问题,这里拿出来给大家分享下。二、实现过程这里他自己有一个原始代码,但是实现的效果不尽人意。importshutilimportos#importsys#导入sys模块#sys.setrecursionlimit(1000)#......
  • VScode下golang 同一个包下不同文件之间函数调用问题
    VScode下golang同一个包下不同文件之间函数调用问题1.问题发现最近在vscode上学习golang的相关开发,发现这样一个问题:同文件夹下的两个文件,在都处于main包的情况下,无法在mian()里直接调用另一个文件中的函数,会报错:undefined。2.原因分析从语法层面上似乎并无问题,但是Go中main......
  • systemd服务无法产生core文件
    解决思路:1、core的生成路径已被配置,确认非空/proc/sys/kernel/core_pattern2、core文件大小限制也去除了ulimit–c core文件的大小限制也设置成了unlimited3、/proc/sys/fs/suid_dumpable已设置为1,防止非本用户组的文件,无权限导致4、不使用systemctl启动进程,也能产生core......
  • Keil_MDK中无法打开map文件的解决办法
    如果在MDK中打开map文件我们在STM32的开发过程中,经常会查看.map文件.map文件是MDK在编译过程中生成的一个包含镜像文件信息的重要文件,在程序编译后自动生成,比方这里我的工程下自动将.map文件生成到了与工程名同名文件夹下的Exe文件里面要想打开.map文件,直接在工程界面双击工程......
  • 使用Python复制某文件夹下子文件夹名为"数据"文件夹下的所有以"DD"开头的文件夹到桌面
    大家好,我是皮皮。一、前言前几天在Python最强王者群【魏哥】问了一个Python自动化办公处理的问题,这里拿出来给大家分享下。二、实现过程这里他自己有一个原始代码,但是实现的效果不尽人意。importshutilimportos#importsys#导入sys模块#sys.setrecursionlimit(10......
  • 深度学习代码实践_train.py文件内容(识别数字0-9)
    importcv2fromMLPimportMLPfromCnnimportsave_modelimporttorchimporttorch.nn.functionalasFfromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_scorefromsklearn.model_selectionimporttrain_test_splitimporttorch.ut......