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

实现

第一步,引入依赖 

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

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

/*** 上传守卫* @param req* @param res* @param next*/
function uploadFile (req, res, next) {// dest 值为文件存储的路径;single方法,表示上传单个文件,参数为表单数据对应的keylet upload = multer({dest: 'uploads/'}).single('file')upload(req, res, (err) => {// 获取文件相应数据let file = req.filelet menutype = req.body.type// 判断是否有上传文件if (file !== undefined) {const isJPG = file.mimetype !== undefined ? file.mimetype === 'image/jpeg' | file.mimetype === 'image/png' : falseconst isLt2M = file.size !== undefined ? file.size / 1024 / 1024 < 2 : falseconst 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.filelet 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.mzph.cn/news/802416.shtml

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

相关文章

Python异常处理try与except跳过报错使得程序继续运行的方法

本文介绍基于Python语言的异常处理模块try与except&#xff0c;对代码中出现的报错加以跳过&#xff0c;从而使得程序继续运行的方法。 在Python语言中&#xff0c;try语句块用于包含可能引发异常的代码&#xff0c;而except语句块则用于定义在出现异常时要执行的代码。其基本结…

Echarts多曲线数值与Y周刻度不符合、Echarts tooltip文字设置左对齐、Echarts折线图背景区间色自定义

Echarts多曲线数值与Y周刻度不符合: 问题描述&#xff1a; 在展示多曲线图表的时候&#xff0c;发现图表曲线数值与Y轴刻度对应不上 问题解决方式&#xff1a; 查看下Echarts的配置option中的seriess属性(多曲线的时候这个属性应该是一个数组)&#xff0c;然后查看数组中的每个…

信用卡客户特征分析

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

内含教程丨最高可降低 16 倍成本,ComfyUI Stable Cascade 教程已上线,一键部署!

2024 年 2 月&#xff0c;OpenAI 又一次站在了镁光灯下&#xff0c;Sora 横空出世并引发热烈讨论&#xff0c;「文生视频」的热潮被那段 60 秒的展示视频再度推高&#xff0c;也使得很多人忽视了其图片生成能力。 更加值得一提的是&#xff0c;其实就在 Sora 发布前不久&#…

vue3 +Taro 页面实现scroll-view 分页功能

需求 现在分页列表 后端只给你一个分页的数据列表 没有总页数 没有当前的分页 页数 只有这么一个list 、、、 如何去分页 我这使用的是scroll-view 组件 滑动到底部的事件 根据你当前设定的每页的数据数量和后端返回给你的数据列表数量 当某一次分页 两个数量不相等了以后 就…

SpringBoot第一个hello world项目

文章目录 前言一、Spring Boot是什么&#xff1f;二、使用步骤1. 创建项目2.书写测试 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了…

javaWeb车辆管理系统设计与实现

摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理分配使用问题。 企业车辆管理系统运用现代化的计算机管理手段&#xff0c;不但可以对车辆的使用进行合理的管理&#xff0c;…

多模态检索增强生成的简单介绍

多模态检索增强生成的简单介绍 文章目录 多模态检索增强生成的简单介绍为什么多模态很难&#xff1f;每种模式都有其自身的挑战您如何跨模式管理信息&#xff1f; 多模态检索方法将所有模态嵌入到同一向量空间中将所有模式归结为一种主要模式对于不同的方式有单独的备用 多模式…

Redis的高可用和持久化

目录 一、Redis高可用 二、Redis持久化 2.1 持久化的功能 2.2 Redis提供两种方式进行持久化 三、RDB持久化 3.1 触发条件 3.1.1 手动触发 3.1.2 自动触发 3.1.3 其他自动触发机制 四、AOF持久化 4.1 开启AOF 4.2 执行流程 4.2.1 命令追加 (append) 4.2.2 文件写入…

生产车间图纸无纸化,生产车间图纸无纸化解决方案

生产车间图纸无纸化是指通过采用数字化设备和技术&#xff0c;将传统的纸质图纸转化为电子文档&#xff0c;并在生产过程中实现图纸的电子化、网络化和自动化管理。这一转变旨在提高工作效率、降低成本、提高安全性&#xff0c;并推动生产车间的现代化和智能化。 实现生产车间图…

SpringBoot 定时任务实践、定时任务按指定时间执行

Q1. springboot怎样创建定时任务&#xff1f; 很显然&#xff0c;人人都知道&#xff0c;Scheduled(cron ".....") Q2. 如上所示创建了定时任务却未能执行是为什么&#xff1f; 如果你的cron确定没写错的话 cron表达式是否合法&#xff0c;可参考此处&#xff0c…

Android集成微信支付

官方api&#xff1a;Android接入指南 | 微信开放文档 打开微信开放平台登录账户后点击创建应用 根据提示填写完相应的内容提交审核通过后&#xff0c;需要开通支付权限。 1.接着在你的项目工程build.gradle文件中添加微信支付依赖库 ​api com.tencent.mm.opensdk:wechat-sdk…

python代码使用过程中使用快捷键注释时报错

1.代码 2.代码报错 3.代码注释后的结果 4. 原因

sql注入方式之联合注入

1.1 靶场环境 系统centos7 IP地址192.168.1.24 1.2 联合注入原理 联合查询注入是联合两个表进行注入攻击&#xff0c;使用关键词 union select 对两个表进行联合查询。两个表的字段要数要相同&#xff0c;不然会出现报错。 1.3 找注入点 找注入点&#xff0c;当输入id1 an…

C语言——文件管理

文件&#xff1a;即磁盘上的文件&#xff0c;使用文件可以将数据直接存放在电脑的硬盘上&#xff0c;做到数据持久化。 在程序设计中&#xff0c;按文件的功能划分&#xff0c;将文件分为程序文件与数据文件 程序文件 程序文件包括源文件&#xff08;.c&#xff09;&#xff0…

Centos7搭建 Skywalking 单机版

介绍 Skywalking是应用性能监控平台&#xff0c;可用于分布式系统&#xff0c;支持微服务、云原生、Docker、Kubernetes 等多种架构场景。 整体架构如图 Agent &#xff1a;在应用中&#xff0c;收集 Trace、Log、Metrics 等监控数据&#xff0c;使用 RPC、RESTful API、Kafk…

【算法详解】二分查找

1. 二分查找算法介绍 「二分查找算法&#xff08;Binary Search Algorithm&#xff09;」&#xff1a;也叫做 「折半查找算法」、「对数查找算法」。是一种在有序数组中查找某一特定元素的搜索算法。 基本算法思想&#xff1a;先确定待查找元素所在的区间范围&#xff0c;在逐步…

骨传导耳机哪个品牌质量比较好?精选六大必看的耳机选购指南

骨传导耳机&#xff0c;是作为近年来深受消费者喜欢的蓝牙耳机产品&#xff0c;目前已经成为了热度最高的骨蓝牙耳机。然而&#xff0c;随着骨传导耳机的热度增高&#xff0c;市场上开始出现一些质量参差不齐、音质不佳的劣质产品&#xff0c;如果使用这些劣质产品的话&#xf…

C语言从入门到实战————文件操作

目录 前言 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名 3. ⼆进制文件和文本文件&#xff1f; 4. 文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文…

基于java+springboot+vue实现的旅游管理系统(文末源码+Lw)23-234

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统旅游管理系统信息管理难度大&#xff0c;容错率低&#…