node后端上传文件到本地指定文件夹

news2024/11/27 8:37:08

实现

第一步,引入依赖 

const fs = require('fs')
const multer = require('multer')

第二步,先设置一个上传守卫,用于初步拦截异常请求

/**
 * 上传守卫
 * @param req
 * @param res
 * @param next
 */
function uploadFile (req, res, next) {
  // dest 值为文件存储的路径;single方法,表示上传单个文件,参数为表单数据对应的key
  let upload = multer({dest: 'uploads/'}).single('file')
  upload(req, res, (err) => {
    // 获取文件相应数据
    let file = req.file
    let menutype = req.body.type
    // 判断是否有上传文件
    if (file !== undefined) {
      const isJPG = file.mimetype !== undefined ? file.mimetype === 'image/jpeg' | file.mimetype === 'image/png' : false
      const isLt2M = file.size !== undefined ? file.size / 1024 / 1024 < 2 : false
      const filepath = file.filename !== undefined ? './uploads/' + file.filename : ''
      const fileName = file.originalname !== undefined ? file.originalname : ''

      // 判断文件处理是否异常
      if (err) {
        // 删除临时文件
        fs.unlinkSync(filepath)
        user.uploadLog(req, fileName, 'false', '文件类型或大小异常错误,请按提示选择文件', 'upload', err)
        res.end(JSON.stringify({
          traceId: req.traceId,
          code: 301,
          msg: '文件类型或大小异常错误,请按提示选择文件',
          data: err
        }))
      } else if (!isJPG | !isLt2M) {
        // 删除临时文件
        fs.unlinkSync(filepath)
        user.uploadLog(req, fileName, 'false', '文件类型或大小超过限制,请按提示选择文件', 'upload', '')
        res.end(JSON.stringify({
          traceId: req.traceId,
          code: 302,
          msg: '文件类型或大小超过限制,请按提示选择文件',
          data: 'isJPG:' + isJPG + ';isLt2M:' + isLt2M
        }))
      } else if (uploadtype.indexOf(menutype) === -1) {
        // 删除临时文件
        fs.unlinkSync(filepath)
        user.uploadLog(req, '', 'false', '上传类型不能为空或者其他', 'upload', '')
        res.end(JSON.stringify({
          traceId: req.traceId,
          code: 308,
          msg: '请求参数缺失或不正确',
          data: 'type类型不合法'
        }))
      } else {
        // 执行上传操作
        next()
      }
    }
  })
}

 第三步,写接口,并引用上面的上传守卫

/**
 * 后端upload上传文件到本地
 * file 上传的文件
 * type 上传类型(头像/聊天)
 */
router.post('/upload', uploadFile, (req, res) => {
  let file = req.file
  let menutype = req.body.type
  // 获取文件后缀名,如'.jpg'
  let index = file.originalname.lastIndexOf('.')
  let type = file.originalname.substr(index)
  // 获取当前年月,作为区分子目录
  let month = moment(Date.now()).format('YYYY-MM')
  // 随机生成16进制的28位数的文件名,用于上传oss时显示
  let ossName = Math.random().toString(16).slice(2) + Math.random().toString(16).slice(2)
  ossName = `${ossName}${type}`
  // 拼接新文件存储路径(文件目录+随机数+文件后缀名),用于上传oss时显示
  let osspath = ''
  if (menutype === 'avatar') {
    osspath = 'upload/' + month + '/' + ossName
  } else {
    osspath = 'chart_upload/' + month + '/' + ossName
  }

  //  临时文件在服务器中的本地路径
  let filePath = './' + req.file.path

  // 重写文件,生成图片,用于上传
  fs.rename(filePath, ossName, (err) => {
    if (err) {
      res.end(JSON.stringify({
        traceId: req.traceId,
        code: 306,
        msg: '临时文件重写为图片失败',
        data: err
      }))
    } else {
      // 复制文件到指定目录
      fs.cp(ossName, 'uploads/' + osspath, (err) => {
        // 删除原文件
        fs.unlink(ossName, err => {
          if (err) {
            console.log('自动删除上传的源文件失败:' + err)
          } else {

          }
        })

        if (err) {
          res.end(JSON.stringify({
            traceId: req.traceId,
            code: 307,
            msg: '图片移动到指定文件夹失败',
            data: err
          }))
        } else {
          res.end(JSON.stringify({
            traceId: req.traceId,
            code: 200,
            msg: '文件上传成功',
            data: osspath
          }))
        }
      })
    }
  })
})

 结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GD32F470_(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件

2.16 火焰传感器 红外火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源&#xff0c;在机器人比赛中&#xff0c;远红外火焰探头起到非常重要的作用&#xff0c;它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人等。 红外火焰传感器…

10-热点文章-定时计算

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路&#xff1a;从数据库直接按照发布时间倒序查询 问题1&#xff1a; 如何访问量较大&#xff0c;直接查询数据库&#xff0c;压力较大 问题2&#xff1a; 新发布的文章会展示在前面&#xff0c;并不是热点文章 …

R语言数据操纵:常用函数

目录 处理循环的函数 lapply函数 apply函数 mapply函数 tapply函数 split函数 排序的函数 sort函数与order函数 总结数据信息的函数 head函数与tail函数 summary函数 str函数 table函数 any函数 all函数 xtab函数 object.size函数 这篇文章主要介绍R语言中处理…

全网最全的APP测试面试题(含文档)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f…

Windows的“上帝模式”

Windows操作系统,以其强大的功能和广泛的兼容性深受全球用户喜爱。然而,随着系统功能的日益丰富,许多深度设置和管理选项可能隐藏在层层菜单之下,不易被普通用户迅速找到。为了简化这一过程,微软在Windows Vista之后的版本中引入了一项鲜为人知但极为实用的功能——“上帝…

鸿蒙千帆起~ 是转?还是留?

近期鸿蒙系统相关行业热度一度高涨&#xff0c;像今天2024年1月18日 鸿蒙OS Next开发者预览版正式发布引起了不少业内人士关注&#xff0c;再度冲上了热榜。余承东老余之前就说过2024年是鸿蒙关键的一年&#xff0c;从这句话就可以看出后一定有大的动作。 就像去年有业内人士网…

【Android】App通信基础架构相关类源码解析

应用通信基础架构相关类源码解析 这里主要对Android App开发时&#xff0c;常用到的一些通信基础类进行一下源码的简单分析&#xff0c;包括&#xff1a; Handler&#xff1a;处理器&#xff0c;与某个Looper&#xff08;一个线程对应一个Looper&#xff09;进行关联。用于接…

自动驾驶中的多目标跟踪_第二篇

自动驾驶中的多目标跟踪:第二篇 上一节介绍了多目标跟踪的定义、应用场景和类型以及面临的挑战&#xff1b;在这一节&#xff0c;我们回顾贝叶斯滤波&#xff0c;简单介绍运动模型和量测模型&#xff0c;卡尔曼滤波等。 附赠自动驾驶学习资料和量产经验&#xff1a;链接 贝叶…

【C语言】青蛙跳台阶问题

题目&#xff1a;一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。现求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 题目分析&#xff1a; 当 n 等于 1 时&#xff0c;青蛙只能跳一级台阶到达&#xff0c;因此只有一种跳法&#xff0c;直接返回 1。当 n 等于 2 时…

信用卡客户特征分析

分析思路 信用卡服务提供了一种方便的贷款方式&#xff0c;允许用户事先消费&#xff0c;之后再支付费用。对银行而言&#xff0c;这种服务既有较高的利润潜力&#xff0c;同时也伴随着用户可能不履行还款义务的风险。本⽂是基于2005年台湾信⽤卡客户数据&#xff0c;探究信⽤…

如何区别进化和演化

在生物学中&#xff0c;"进化"和"演化"这两个词通常可以互换使用&#xff0c;它们都指的是生物种群随时间推移而发生的遗传变化。然而&#xff0c;在某些语境中&#xff0c;这两个词可能会有细微的差别&#xff1a; 进化&#xff08;Evolution&#xff09;…

C#.net手术麻醉信息系统源码,集成HIS、EMR、LIS、PACS系统

手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能据如实准确地反映患者生命体征参数的变化&#xff0c;并实现信息高度共享&#xff0c;根据采集结果&#xff0c;综合其他患者数据&#xff0c;自动生成手术麻醉…

MySQL数据库基础--索引

索引概述 索引是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09; 优缺点 优势劣势提高数据检索的效率&#xff0c;降低数据库的IO成本索引列也是要占用空间的通过索引列对数据进行排序&#xff0c;降低数据排序的成本&#xff0c;降低CPU的消耗索引大大提高了查…

xss.pwnfunction-Ah That‘s Hawt

<svg/onloadalert%26%2340%3B1%26%2341%3B> <svg/>是一个自闭合形式 &#xff0c;当页面或元素加载完成时&#xff0c;onload 事件会被触发&#xff0c;从而可以执行相应的 JavaScript 函数

649.Dota2 参议院

题目&#xff1a;Dota2 的世界里有两个阵营&#xff1a;Radiant&#xff08;天辉&#xff09;和 Dire&#xff08;夜魇&#xff09; Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中&am…

abap 增强查找

初代增强 查找&#xff1a;se38 Z_FIND_USEREXIT ZENHANCE_FIND 没有的话可以复制下面查找增强代码 REPORT z_find_userexit NO STANDARD PAGE HEADING.*&---------------------------------------------------------------------**& Enter the transaction code…

机器学习 —— MNIST手写体识别

本文使用工具 Anaconda下载安装与使用 Jupyter Notebook的使用 pytorch配置 Jupyter notebook Pycharm 本文使用数据集 机器学习实验所需内容.zip 点击跳转至正文部分 pytorch配置 Jupyter notebook 1、打开 Anaconda…

Unity MySql安装部署与Unity连接 上篇

1.前言 最近项目用到MySql&#xff0c;记录一下安装部署过程。 数据量过大或者需要管理用户数据的时候用mysql的话数据结构比较清晰明了&#xff0c;便于管理。 2.安装MySql Unity版本&#xff1a;2019.4.16 MySql版本&#xff1a;8.2.0 下载地址&#xff1a;MySql 下载…

全新AI天空任意生成解决方案,颠覆传统换天效果

在数字化时代&#xff0c;影像创作已经成为企业展示品牌形象、传递信息的重要手段。特别是在汽车拍摄和旅行拍摄等场景中&#xff0c;天空作为画面中不可或缺的元素&#xff0c;其表现往往直接关系到作品的质感和吸引力。然而&#xff0c;传统的天空替换技术往往操作繁琐、效果…

Docker内更新Jenkins详细讲解

很多小伙伴在Docker中使用Jenkins时更新遇到困难&#xff0c;本次结合自己的实际经验&#xff0c;详细讲解。根据官网Jenkins了解以下内容&#xff1a; 一、Jenkins 是什么? Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测…