[记录六]Vue+node+koa2+mysql+nginx+redis,全栈开发小程序和管理员管理系统项目——服务端图片上传与下载

article/2025/9/29 10:12:30

大家好,我是小佑@小佐:https://blog.csdn.net/Smell_rookie,是一名页面仔工程师,我会不定时在CSDN更新我的博客,有兴趣的可以点个关注来逛逛我的主页。
前言:本项目需要涉及前端上传图片与显示图片,为此自己实践一下图片相关的东西,挺有意思所以就分享出来。
实现思路:服务端的处理方式是将前端上传的文件保存在服务端本地,然后重命名该文件名字,再将图片在服务端的路径存入表中,前端请求图片地址的时候去服务端找出文件并返回给前端显示。

在routes文件夹下新建一个common.js文件

//common.js
//导入所需模块
const router = require('koa-router')()
const api = require('../controllers/api')
const common = require('../util/comon')
const path = require('path')
const fs = require('fs')
const formidable = require('formidable')
const MimeLookup = require('mime-lookup')
const mime = new MimeLookup(require('mime-db'))
router.prefix('/common')

上传图片

//common.js
//上传图片
router.post('/addUploadImg', async (ctx, next) => {console.log(ctx.req)let form = new formidable.IncomingForm()form.hash = "md5"form.multiples = false //默认只能上传一个文件,更多form的配置参考node-formidableform.maxFileSize = 2 * 1024 * 1024 //设置文件最大不超过2Mlet type = ['image/png','image/gif','image/jpg','image/jpeg','image/webp']//支持上传的图片类型function formImage() {return new Promise((resolve, reject) => {form.parse(ctx.req, async function (err, fields, files) {//注意:跟express有差异,这里要传入ctx.reqlet file = files['file']if (file) {let flag = await common.checkFile(file.type, file.size) //校验文件的大小和类型console.log('校验通过'+flag)if (flag) { //文件校验通过const oldpath = file['_writeStream'].path //系统缓存上传的文件地址const dir = path.join(__dirname, `../common/upload/img`)const fileFormat = file.name.split('.')file.name = `${file.hash}_${Date.now()}.${fileFormat[fileFormat.length - 1]}` //通过file.hash加时间戳生成文件名const newpath = `common/upload/img/${file.name}`if (!fs.existsSync(dir)) { //先判断文件夹名是否存在,不存在则生成根据XXX生成对应的文件夹fs.mkdirSync(dir)}//如果是非WINDOWS系统,可以用fs.renameSync()来实现,这里为了兼容用了node的pipe来实现let readStream = fs.createReadStream(oldpath)let writeStream = fs.createWriteStream(newpath)readStream.pipe(writeStream) //这里文件已经上传成功resolve(ctx.origin + "/" + newpath) //返回完整的文件地址} else {reject(null)}} else {reject(null)}})})}await formImage().then(res => { ctx.body = {code: 200,status: 200,data: res,message:'上传成功'}}).catch(err => { ctx.body = {code: 400,status: 200,data: {},message:'上传失败'}})
})

下载图片

//common.js
//显示图片
router.get('/upload/img/:imgUrl', async (ctx, next) => {url=ctx.urllet index = url.lastIndexOf('/')imgUrl = url.substring(index + 1, url.length)let filePath = path.join(__dirname, `../common/upload/img/${imgUrl}`)file = fs.readFileSync(filePath)//读取文件// console.log(await watermark.addWatermark(file, options))let mimeType = mime.lookup(filePath) //读取图片文件类型ctx.set('content-type', mimeType) //设置返回类型ctx.body = file //返回图片
})

这里下载的意思是前端拿到图片链接,直接img src="https://***/upload/img.123sdjfhg.png"的时候服务端其实是需要响应前端的这个地址请求的,上面是收到请求后去服务端获取图片并读取然后返回文件回给前端。假设有做token校验是否可以请求api的话,建议将“/common/upload/”接口的路由放入白名单(免token)中去。

文件结构

最终在项目中呈现的结构是:
在这里插入图片描述
至此就完成前端图片上传和下载的需求了,感谢观看!

上一篇:使用swagger自动生成接口文档
上一篇:生成请求日志


http://chatgpt.dhexx.cn/article/ybYpWxYt.shtml

相关文章

Vue.js 最新官方下载地址与项目导入

目录 VUE2下载网址 VUE2使用示例&#xff1a; VUE3下载与使用 VUE3示例&#xff1a; 在官网上下载vue.js或者是vue.min.js。并用<script>标签引入。 应小伙伴要求区分一下版本&#xff1a; VUE2下载网址 Installation — Vue.jsVue.js - The Progressive JavaScrip…

vue.js下载及安装的三种方法

vue.js下载及安装的三种方法 要下载安装vue首先得下载安装node.js和npm。下载安装好这两样以后就可以安装vue了&#xff0c;下面给大家介绍三种安装vue的方法。 1.直接在官网上下载 在官网上下载vue.js。并用<script>标签引入。 注意&#xff1a;下载时网址是 https://vu…

vue下载

第一步&#xff1a; 安装 node.js &#xff08;如果已安装就不用装了&#xff0c;当然如果你想安装最新版本的node.js最好是从新安装一遍&#xff09; node.js安装官网地址 https://nodejs.org/zh-cn/ 安装完成之后 winr 键 打开运行 输入cmd 打开命令行窗口 输入 node -v …

vue+node.js+express+axios实现连接mysql数据库(前后端分离,详细版)

这两个星期都在学vue技术&#xff0c;感觉真的是博大精深啊&#xff01; 今天&#xff0c;我给大家总结了用axios连接数据库的步骤&#xff0c;让大家少走弯路&#xff08;不像我&#xff0c;我用axios连了两天才连接成功。。。&#xff09; 1、首先&#xff0c;确保你已经有了…

VUE下载及安装

下载node.js node.js下载 &#xff0c;选择长期维护版安装NODE&#xff0c;直接全部默认&#xff0c;不要安装在C盘设置NODE 在nodejs安装路径下&#xff0c;新建node_global和node_cache两个文件夹&#xff0c;这是npm安装的全局模块所在的路径&#xff0c;以及缓存cache的路径…

全网最新的vue.js下载和安装的3种方法(2023年)

文章目录 1. 文章引言2. 环境搭建3. 安装vue.js3.1 方法一&#xff1a;官网下载vue.js源代码3.2 方法二&#xff1a;使用npm install创建3.3 方法三&#xff1a;使用bower下载 4. 总结 1. 文章引言 我主要从事java后端开发&#xff0c;但对前端也非常感兴趣&#xff0c;立志成…

Vue连接MySql数据库

一、vue-cli2 全局安装 npm install vue-cli -g 局部安装项目 vue init webpack 项目名称 例如&#xff1a;vue init webpack demo1 二、express-generator 1.全局安装 npm install express-generator -g 2.express --viewejs 项目名称 例如&#xff1a;express --view…

vue+mysql实现前端对接数据库

下载引入相关依赖 1、cnpm install --save mysql 2、cnpm install --save axios 3、cnpm install --save body-parser 4、cnpm install --save express 5、cnpm install --save crypto 在main中引入axios import Axios from axios Vue.prototype.$axios axios 配置连接…

vue下载与安装详细教程

1、安装node&#xff08;网址&#xff1a;https://www.bilibili.com/video/BV1LA411u7dE?t10&#xff09; ①、进入node官网https://nodejs.org/zh-cn/ 点击下载&#xff0c;选择适配的 ②、 双击安装&#xff0c;安装路径随意&#xff0c;勾选第四项&#xff0c;把node添加进…

Vue下载与安装

首先安装node.js环境&#xff1a; node.js安装推荐文章&#xff1a;https://www.cnblogs.com/zhouyu2017/p/6485265.html 基于node.js安装淘宝镜像npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装全局vue-cli脚手架,用于帮助搭建所需的模板框架 在cmd…

【Vue前端】Vue+MySQL(整体用到vue-vli、ElementUI)

提示&#xff1a;小白自学Vue前端&#xff0c;记录一些知识点 VueMySQL(整体用到vue-cli、ElementUI&#xff09; 目录一、相关准备1. 连接数据库2. 添加相关依赖 二、 使用步骤1. userApi.js2. db.js3. index.js4. server目录下新建sqlMap.js5. register.vue6. main.js7. 启动…

vue项目之js对Mysql数据库操作

vue项目之js对Mysql数据库操作 文章目录 vue项目之js对Mysql数据库操作前言一、相关插件安装二、搭建本地服务器三、启动服务器四、前端Vue访问接口进行数据交互结尾 前言 js对数据库的基本操作 一、相关插件安装 下载express&#xff0c;Express 的作用和 Node.js 内置的 htt…

Vue.js + express +mysql实现数据库增删改查

Vue.js express mysql实现数据库增删改查 1、 下载安装Node.js 在Node.js官网可下载 2、下载vue-cli脚手架 npm install vue-cli -g 3、 创建项目 后面是项目名称&#xff0c;在安装项目过程中需要选择安装vue-router vue init webpack mysqlconnect 4、安装vue-resource依赖…

vue、jdk、nodejs、maven、tomcat、git、MinGW、mysql、navicat下载与安装

常用Java工具配置操作 文章目录 常用Java工具配置操作一、Vue1.vue2.0安装与项目搭建1)基本环境安装2)项目搭建 2.vue3.0安装与项目搭建1)基本环境安装2)项目搭建 3.升级Vue3.0项目4.小操作 二、JDK三、NodeJs四、Maven五、Tomcat六、Git七、MinGW八、MySql1.下载mysql2.使用命…

生信技能树 linux下安装bowtie2和使用bowtie2进行初步比对

linux下安装软件 echo $PATH ##查看路径echo $PATH|tr ":" "\n"|xargs ls -lh ls -lh /usr/bin 下载安装Bowtie2 首先在root下新建一个Biosoft的文件夹&#xff0c;切换目录到该文件夹 cd Biosoft 再在该文件夹下&#xff0c;新建一个Bwotie2的文件夹 mk…

LCWGS(6)在Linux服务器上安装Bowtie2

Bowtie2是一种用于将序列读段与长参考序列进行比对的超快且内存高效的工具。它特别擅长对齐大约50到100或1000个字符的读段&#xff0c;并且特别擅长对齐相对较长的&#xff08;如哺乳动物&#xff09;基因组。Bowtie2用FM索引对基因组进行索引&#xff0c;以保持其占用的内存空…

Bowtie2去除污染的使用方法

简介 Bowtie 2是一种用于长参考序列对齐测序读取的工具。它尤其擅长将大约50-100多个字符的比对到相对较长的&#xff08;例如哺乳动物&#xff09;基因组。Bowtie 2支持gapped, local,and paired-end alignment模式。可以同时使用多个处理器以实现更高的对齐速度。 使用方法 b…

html怎么删除链接css,css如何去掉链接的下划线?

我们在HTML网页制作过程中&#xff0c;相信大家对超链接这个概念并不陌生。我们都知道想要给某段文本或者指定元素添加一个锚点也就是超链接需要用到HTML中的a标签。 在使用a标签时文本超链接会自动出现下划线&#xff01;这就让一些小白们感到苦恼了&#xff0c;因为从视觉美观…

CSS学习笔记

目录 1. 学习CSS的基础 1.1 基本语法规范 1.2 引入方式 2. 选择器 2.1 选择器的功能和种类 2.2 基础选择器 2.3 复合选择器 2.3.1 后代选择器 2.3.2 子选择器 2.3.3 并集选择器 2.3.4 伪类选择器 3. 常用元素属性 3.1 字体属性 3.2 文本属性 3.3 背景属性 3.4 圆角…

HTML 类别选择器下划线,css text-decoration下划线 删除线 上划线属性样式

一、DIV+CSS下划线基础 DIV CSS text-decoration下划线、删除线、上划线属性,本节介绍使用div+css样式实现文字字体下划线、字体删除线贯穿线、上划线样式。 1、CSS控制下划线出现用到地方 - TOP 在DIV CSS网页中常常使用CSS代码来人对象文字内容加上下划线。 使用CSS属性单词…