基于 Vue 和 Node.js 实现图片上传功能:从前端到后端的完整实践
在开发一个社交分享平台时,图片上传功能是核心需求之一。本文将基于一个旅拍社交分享系统,详细解析其图片上传功能的实现原理和技术细节,包括前端处理、后端接收和数据库存储等环节。
1. 前端图片上传实现
在这个项目中,图片上传功能主要在resend.vue
组件中实现,用户可以通过表单选择图片并提交到服务器。
核心代码片段:
<template><a-form :model="formData" ref="forRef"><!-- 其他表单字段 --><a-form-item label="上传图片" name="upload"><input type="file" @change="handleAvatarChange" class="file-input" /></a-form-item><a-button @click="handelChange">提交</a-button></a-form>
</template><script setup>
import { ref } from 'vue'const formData = ref({})// 处理图片选择
const handleAvatarChange = (event) => {const file = event.target.files[0]if (file) {formData.value.avatarFile = file // 保存选中的文件}
}// 提交表单
const handelChange = async () => {await forRef.value.validateFields()// 创建FormData对象const formPayload = new FormData()// 添加文本字段formPayload.append('title', formData.value.title)formPayload.append('content', formData.value.content)// ...其他字段// 添加文件字段(关键部分)if (formData.value.avatarFile) {formPayload.append('avatar', formData.value.avatarFile)}// 发送请求const res = await resendDataList(formPayload)if (res.code == 200) {message.success('发帖成功!')router.push('./home')} else {message.error('发帖失败!')}
}
</script>
代码解释:
-
文件选择处理:
- 通过
<input type="file">
触发文件选择对话框 handleAvatarChange
方法将选中的文件保存到formData.avatarFile
- 通过
-
表单数据处理:
- 使用
FormData
对象封装表单数据,支持二进制文件上传 append
方法将文本字段和文件字段添加到FormData
中
- 使用
-
请求发送:
- 使用
axios
(封装在resendDataList
中)发送请求 - 设置
Content-Type
为multipart/form-data
,由浏览器自动处理边界
- 使用
2. 后端图片接收与处理
后端使用 Node.js 和 Express 框架处理图片上传请求,并使用multer
中间件处理文件。
核心代码片段(resend.js
):
const express = require("express");
const router = express.Router();
const multer = require('multer');
const db = require("../db/index");// 配置multer存储引擎
const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, "E:/test/img"); // 存储路径},filename: function (req, file, cb) {cb(null, Date.now() + '-' + file.originalname); // 文件名格式}
});const upload = multer({ storage: storage });// 处理图片上传请求
router.post('/addResendList', upload.single('avatar'), (req, res) => {// 调试日志console.log('[请求体]', req.body);console.log('[上传文件]', req.file);// 参数校验const requiredFields = ['title', 'content', 'address', 'category', 'longitude', 'latitude'];const missingFields = requiredFields.filter(field => !req.body[field]);if (missingFields.length > 0) {return res.status(400).json({status: 1,message: `缺少必填字段: ${missingFields.join(', ')}`,code: 400});}// 处理图片路径const imagePath = req.file ? `/static/${req.file.filename}` : '';// 插入数据库const insertSql = `INSERT INTO list_table (account, title, content, address, category, longitude, latitude, images, create_time, visibility) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;db.query(insertSql, [req.body.account,req.body.title,req.body.content,req.body.address,req.body.category,req.body.longitude,req.body.latitude,imagePath,new Date(),'all'], (err, result) => {if (err) {console.error('[数据库错误]', err);return res.status(500).json({status: 1,message: '数据库操作失败',error: err.message,code: 500});}res.status(200).json({status: 0,data: {table_id: result.insertId,images: imagePath},message: "提交成功",code: 200});});
});
代码解释:
-
Multer 配置:
diskStorage
指定文件存储路径和文件名格式upload.single('avatar')
处理单个文件上传,字段名为avatar
-
文件处理:
req.file
包含上传的文件信息(文件名、大小、类型等)- 图片被保存到指定目录,并生成唯一文件名(时间戳 + 原文件名)
-
数据库操作:
- 将图片路径(如
/static/1638532765432-avatar.jpg
)存入数据库 - 通过
table_id
关联图片与打卡点信息
- 将图片路径(如
注意⚠️:实际参数可自行调整修改。
3. 图片展示与访问
前端通过拼接完整 URL 访问服务器上的图片:
代码片段(UserPost.vue
):
<template><div class="post-card"><img :src="'http://localhost:8080' + post.images" alt="User Post" /></div>
</template>
后端配置(app.js
):
// 设置静态资源目录
app.use('/static', express.static('E://test//img'));
解释:
- 前端通过
http://localhost:8080/static/文件名
访问图片 - 后端使用
express.static
中间件将/static
路径映射到实际存储目录
4. 关键技术点总结
-
前端要点:
- 使用
FormData
处理混合表单数据(文本 + 文件) - 文件选择事件绑定与数据缓存
- 图片预览功能(本文未展示,但可通过
FileReader
实现)
- 使用
-
后端要点:
multer
中间件处理文件上传- 文件存储策略(路径、命名规则)
- 图片路径与业务数据关联
-
安全与优化建议:
- 文件类型验证(限制只允许图片格式)
- 文件大小限制(防止大文件攻击)
- 图片压缩处理(减少存储和传输成本)
- 图片访问权限控制(私有图片需身份验证)
总结
通过这个项目的实现,我们可以看到图片上传功能的完整流程:从前端表单选择,到后端接收存储,再到最终展示。关键在于前后端的协作:前端正确构建FormData
对象,后端使用合适的中间件处理文件,并将文件路径与业务数据关联。
这种实现方式不仅适用于旅拍社交系统,也可应用于各种需要图片上传功能的 Web 应用中。通过合理的架构设计和安全措施,可以构建出高效、稳定的图片上传服务。
注意:内容仅供参考,实际项目中可按需要进行修改和排查。
相关文章:
基于 Vue 和 Node.js 实现图片上传功能:从前端到后端的完整实践
在开发一个社交分享平台时,图片上传功能是核心需求之一。本文将基于一个旅拍社交分享系统,详细解析其图片上传功能的实现原理和技术细节,包括前端处理、后端接收和数据库存储等环节。 1. 前端图片上传实现 在这个项目中,图片上传…...
go封装将所有数字类型转浮点型,可设置保留几位小数
封装转换方法 /* * * 将类型转浮点型,并保留小数 ToFloat(123, 2) ToFloat(3.5254, 0) */ func ToFloat(value interface{}, precision int) (float64, error) {var f float64var err errorswitch v : value.(type) {case float64:f vcase float32:f float64(v)c…...
Rust 学习笔记:关于 Vector 的练习题
Rust 学习笔记:关于 Vector 的练习题 Rust 学习笔记:关于 Vector 的练习题哪个调用会报错?以下代码能否通过编译?若能,输出是?以下代码能否通过编译?若能,输出是?以下代码…...
Linux 系统异常触发后自动重启配置指南
Linux 系统异常触发后自动重启配置指南 一、内核级自动重启配置 适用于内核崩溃(Kernel Panic)、硬件驱动故障等场景,通过 SysRq 和 Watchdog 实现快速恢复。 1. SysRq 强制重启 功能:通过触发内核崩溃或强制重启,绕…...

apisix透传客户端真实IP(real-ip插件)
文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses?安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理(如 Nginx、HAProxy、云厂商的 LBÿ…...

Oracle 数据库的默认隔离级别
Oracle 数据库的默认隔离级别 默认隔离级别:READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别,这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…...
统计客户端使用情况,使用es存储数据,实现去重以及计数
这篇文件的重点在tshark、filebeat、和logstash。 需求:统计客户使用的客户端版本 实现工具:tshark 1.10.14,filebeat 8.17.0,logstash 8.17.0,elasticsearch 8.17.0,kibana 8.17.0 总体设计:…...

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I
每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra(…...
oracle序列自增问题
1.先查询表名对应的序列名称 SELECT trigger_name, trigger_type, triggering_event FROM all_triggers WHERE table_name 表名;2. 查询id最大值 SELECT MAX(ID) FROM 表名;3. 查询下一次生成ID SELECT SJCJ_ENERGY_DATA_INSERTID.NEXTVAL FROM DUAL;4. 设置临时步长,越过…...

开启健康生活的多元养生之道
健康养生是一门值得终身学习的学问,在追求健康的道路上,除了常见方法,还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道,能让我们的生活更健康、更有品质。 室内环境的健康不容忽视。定期清洁空调滤网,避…...

【Vite】前端开发服务器的配置
定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…...
鸿蒙OSUniApp 制作自定义弹窗与模态框组件#三方框架 #Uniapp
UniApp 制作自定义弹窗与模态框组件 前言 在移动应用开发中,弹窗和模态框是用户交互的重要组成部分,它们用于显示提示信息、收集用户输入或确认用户操作。尽管 UniApp 提供了基础的交互组件如 uni.showModal() 和 uni.showToast(),但这些原…...

Spring Security与Spring Boot集成原理
Spring Security依赖的是过滤器机制,首先是web容器例如tomcat作为独立的产品,本身有自己的一套过滤器机制用来处理请求,那么如何将tomcat接收到的请求转入到Spring Security的处理逻辑呢?spring充分采用了tomcat的拓展机制提供了t…...

VScode各文件转化为PDF的方法
文章目录 代码.py文件.ipynb文本和代码夹杂的文件方法 1:使用 VS Code 插件(推荐)步骤 1:安装必要插件步骤 2:安装 `nbconvert`步骤 3:间接导出(HTML → PDF)本文遇见了系列错误:解决方案:问题原因步骤 1:降级 Jinja2 至兼容版本步骤 2:确保 nbconvert 版本兼容替代…...
精益数据分析(58/126):移情阶段的深度实践与客户访谈方法论
精益数据分析(58/126):移情阶段的深度实践与客户访谈方法论 在创业的漫长旅途中,正确识别和验证问题是成功的第一步。今天,我们继续围绕《精益数据分析》中创业阶段的核心内容,深入探讨移情阶段的关键实践…...

Vue3学习(组合式API——Watch侦听器、watchEffect()详解)
目录 一、Watch侦听器。 (1)侦听单个数据。 (2)侦听多个数据。(数组写法?!) (3)immediate参数。(立即执行回调) (3)deep参数。(深层监…...

【node.js】安装与配置
个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js简介1.1 Node.js的特点1.2 Node.js架构 2. Node.js安装2.1 下载和安装方法2.1.1 Windows安装2.1.2 macOS安装2.1.3 Linux安装 2.2 使用NVM安装和管理Node.js版本2.2.1 安装NVM2.2.2 使用NVM管理Node…...

《AI大模型应知应会100篇》第62篇:TypeChat——类型安全的大模型编程框架
第62篇:TypeChat——类型安全的大模型编程框架 摘要 在构建 AI 应用时,一个常见的痛点是大语言模型(LLM)输出的不确定性与格式不一致问题。开发者往往需要手动解析、校验和处理模型返回的内容,这不仅增加了开发成本&a…...
HttpMessageConverter 的作用是什么? 它是如何实现请求体到对象、对象到响应体的自动转换的(特别是 JSON/XML)?
HttpMessageConverter (HTTP 消息转换器) 是 Spring MVC 框架中一个非常核心的组件,它的主要作用是在 HTTP 请求和响应体与 Java 对象之间进行双向转换。 核心作用: 读取请求体 (Request Body) 到 Java 对象: 当 Controller 方法的参数使用 …...

EdgeShard:通过协作边缘计算实现高效的 LLM 推理
(2024-05-23) EdgeShard: Efficient LLM Inference via Collaborative Edge Computing (EdgeShard:通过协作边缘计算实现高效的 LLM 推理) 作者: Mingjin Zhang; Jiannong Cao; Xiaoming Shen; Zeyang Cui;期刊: (发表日期: 2024-05-23)期刊分区:本地链接: Zhang 等 - 2024 …...

火山 RTC 引擎9 ----集成 appkey
一、集成 appkey 1、网易RTC 初始化过程 1)、添加头文件 实现互动直播 - 互动直播 2.0网易云信互动直播产品的基本功能包括音视频通话和连麦直播,当您成功初始化 SDK 之后,您可以简单体验本产品的基本业务流程,例如主播加入房间…...
ArcGIS Pro 3.4 二次开发 - 框架
环境:ArcGIS Pro SDK 3.4 .NET 8 文章目录 框架1 框架1.1 如何在 DockPane 可见或隐藏时订阅和取消订阅事件1.2 执行命令1.3 设置当前工具1.4 激活选项卡1.5 激活/停用状态 - 修改条件1.6 判断应用程序是否繁忙1.7 获取应用程序主窗口1.8 关闭 ArcGIS Pro1.9 获取 …...

Adminer:一个基于Web的轻量级数据库管理工具
Adminer 是一个由单个 PHP 文件实现的免费数据库管理工具,支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、SQL Server、Oracle、Elasticsearch、SimpleDB、MongoDB、Firebird、Clickhouse 等数据库。 Adminer 支持的主要功能如下: 连接数据库服…...

RK3568下QT实现按钮切换tabWidget
运行效果: 在 Qt 应用程序开发过程中,TabWidget 是一种非常实用的 UI 组件,它能够以选项卡的形式展示多个页面内容,帮助我们有效组织和管理复杂的界面布局。而在实际使用时,常常会有通过按钮点击来切换 TabWidget 页面的需求,本文将通过一个完整的示例,详细介绍如何在 Q…...

2025 OceanBase 开发者大会全议程指南
5 月 17 日,第三届 OceanBase 开发者大会将在广州举办。 我们邀请数据库领军者与AI实践先锋,与开发者一起探讨数据库与 AI 协同创新的技术趋势,面对面交流 OceanBase 在 TP、AP、KV 及 AI 能力上的最新进展,深度体验“打破技术栈…...
GitHub 趋势日报 (2025年05月15日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1TapXWorld/ChinaTextbookPDF教材。⭐ 6685⭐ 15287Roff2xming521/WeClone&…...

day017-磁盘管理-实战
文章目录 1. 硬盘命名规则2. 添加硬盘2.1 查看硬盘名称 3. 硬盘分区3.1 分区命名规则:mbr分区表格式3.2 创建分区:fdisk3.2.1 fdisk -l:查看硬盘及分区信息3.2.2 fdisk /dev/sdc :为该硬盘分区3.2.3 创建扩展分区和逻辑分区3.2.4 保存设置并退…...

【成品设计】STM32和UCOS-II的项目
项目1:《基于STM32和UCOS-II的水质监测系统》 Ps:分为带系统版本和不带系统版本,功能都一样。 功能说明: 1. 单片机主控:STM32F103C8T6单片机作为核心控制。 2. 酸碱度传感器:实时采集当前PH值。 3. 水质…...
当通过PHP在线修改文件数组遇到不能及时生效问题
当你通过PHP在线修改文件中的数组(比如配置文件、缓存文件等)后,发现修改不能及时生效,常见原因和解决办法如下: 1. 缓存未刷新 问题描述:PHP应用通常会对配置、数据等做缓存(如Redis、Memcached、OPcache、文件缓存等),导致你修改了文件但实际运行时还是旧内容。解决…...

Ngrok 配置:实现 Uniapp 前后端项目内网穿透
文章目录 一、下载并安装 ngrok二、配置 ngrok Authtoken三、启动本地 uniapp 项目四、使用 ngrok 暴露本地服务五、通过公网 URL 访问项目六、后端API项目的穿透问题排查 (uni-app 后端 API 示例)交互流程图示 七、ngrok Web 界面 (本地监控)八、停止 ngrok总结 ngrok 是一款…...