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.rhkb.cn/news/311193.html

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

相关文章

如何在SFTP工具中使用固定公网地址远程访问内网Termux系统

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

MVVM、MVC、MVP的区别

MVC、MVP 和 MVVM 是三种常见的软件架构设计模式&#xff0c;主要通过分离关注点的方式来组织代码结构&#xff0c;优化开发效率。 在开发单页面应用时&#xff0c;往往一个路由页面对应了一个脚本文件&#xff0c;所有的页面逻辑都在一个脚本文件里。页面的渲染、数据的获取&a…

Day01-环境准备与镜像案例

Day01-环境准备与镜像案例 1. 容器架构1.1 Iaas Paas Saas (了解)1.2 什么是容器1.3 容器vs虚拟机1.4 Docker极速上手指南1&#xff09;配置docker源(用于安装docker)2&#xff09;docker下载镜像加速的配置3&#xff09;自动补全 1.5 Docker C/S架构1.6 Docker的镜像管理1&…

每日练习——leetcode402. 移掉 K 位数字和17. 电话号码的字母组合

目录 402. 移掉 K 位数字 题目描述 解题思路 代码实现 17. 电话号码的字母组合 题目描述 解题思路 代码实现 402. 移掉 K 位数字 题目描述 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请…

为了保护版权,有大量图片需要加logo水印怎么办?快速批量加水印 一键可批量加水印几十张 几百张

一&#xff0c;加水印必要性 在数字化时代&#xff0c;图片作为信息传递的重要媒介&#xff0c;其保护和管理显得尤为重要。而给图片添加水印则是一种有效的方式&#xff0c;它不仅能够防止图片被未经授权地复制和盗用&#xff0c;还能够标明图片的来源和版权信息&#xff0c;…

【Spring】依赖注入(DI)时常用的注解@Autowired和@Value

目录 1、Autowired 自动装配 1.1、要实现自动装配不是一定要使用Autowired 1.2、Autowired的特性 &#xff08;1&#xff09;首先会根据类型去spring容器中找(bytype),如果有多个类型&#xff0c;会根据名字再去spring容器中找(byname) &#xff08;2&#xff09;如果根据名…

springcloud-fegin 组件调用

一、Feign 概述 Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c; Feign可以帮助我们更快捷、优雅地调用HTTP API。 在Spring Cloud中&#xff0c;使用Feign非常简单——创建一个接口&#xff0c;并在接口上添加一些注解&#xff0c;代码就完成了。Feign支持多种…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数…

Day01——NestJS学习之了解、安装、运行

什么是 Nest.js&#xff1f; NestJs 官方简介: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#x…

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用&#xff1a; 求解当前元素右边比该元素大的第一个元素&#xff08;左右、大小都可以&#xff09;。 单调栈的构成&#xff1a; 单调栈里存储数组的下标&#xff1b; 单调栈里的元素递增&#xff0c;求解当前元素右边比该元素大的第一个元素&#xff1b;元素递…

【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 成员变量&#xff08;实例变量&#xff09;类变量&#xff08;静态变量&#xff09;定义方式静态变量的使用场景 成员变量&#xff08;实例变量&#xff09; 成员变量声明在一个类中&#xff0c;但在方法、构造…

【opencv】示例-videocapture_openni.cpp 深度数据获取和处理的示例

该代码是一个与使用OpenCV进行深度传感器捕获和处理相关的程序的一部分。主要功能包括处理Kinect或XtionPRO等深度传感器数据&#xff0c;解析命令行参数&#xff0c;打开视频捕获设备&#xff0c;以及在GUI上显示深度图&#xff0c;彩色图像&#xff0c;和红外图像等。代码中使…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc

byobu

byobu 终端多路复用器 一、byobu 安装二、byobu 使用三、其他终端多路复用器四、ssh byobu 远程协作 系统环境: linux(ubuntu,debian,kali) 一、byobu 安装 byobu 是包装过的tmux #sudo apt install tmux sudo apt install byobubyobu二、byobu 使用 创建窗口: Ctrl a c…

HashMap的扩容看这一篇足够

在Java中&#xff0c;对于HashMap这样的实现&#xff0c;put方法是用来将一个键值对插入到Map中的核心方法。以下是HashMap类中put方法的大致执行流程&#xff1a; 计算Hash值&#xff1a; 首先&#xff0c;put方法会接收一个键&#xff08;Key&#xff09;和一个值&#xff0…

攻防世界13-simple_php

13-simple_php <?php show_source(*__FILE__*);//高亮文件 include("config.php");//文件包含在内 $a$_GET[a];//获得a $b$_GET[b];//获得b if($a0 and $a){ //判断a是否满足条件echo $flag1; //满足就输出flag1 } if(is_numeric($b)){ //判断b的条件&#x…

Python | Leetcode Python题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; class Solution:def removeDuplicates(self, nums: List[int]) -> int:if not nums:return 0n len(nums)fast slow 1while fast < n:if nums[fast] ! nums[fast - 1]:nums[slow] nums[fast]slow 1fast 1return slow

Git可视化工具 - 推荐

概述 Git版本管理工具是我们日常开发中常用的工具&#xff0c;熟练使用它可以提高我们的工作效率。 当然老司机基本使用命令行的方式进行操作&#xff0c;新手可借助可视化工具来进行过渡&#xff0c;命令行与可视化工具结合使用来加深对Git的熟悉程度。 下面推荐两个较受欢迎…

MySQL 试图

视图功能在 5.0 以后的版本启用 视图是一张虚表。数据表确实包含了具体数据并且保存到硬盘中的实表。视图使用数据检索语句动态生 成的一张虚表。每一次数据服务重启或者系统重启之后&#xff0c;在数据库服务启动期间&#xff0c;会使用创建视图的语 句重新生成视图中的数据&…

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…