从前端向后端发送multipart/form-data 类型数据(主要用于文件上传或表单提交)

如发送如下信息:

前端代码vue文件:(配置了服务器代理)

<template><div class="content"><el-form :model="form" ref="form" :rules="rules"  label-width="100px" class="demo-form"><div class="infoAdd"><div class="title">申请信息</div><el-form-item label="申请人" prop="proposer_Name"><el-input v-model="form.proposer_Name" placeholder="请输入申请人姓名"></el-input></el-form-item><el-form-item label="联系电话" prop="telephone"><el-input v-model="form.telephone" placeholder="请输入手机号码"></el-input></el-form-item><el-form-item label="身份证号" prop="cardId"><el-input v-model="form.cardId" placeholder="请输入身份证号"></el-input></el-form-item><el-form-item label="营业执照" prop="charterName"><el-input v-model="form.charterName" placeholder="请输入营业执照(名称)"></el-input></el-form-item><el-form-item label="所在区域" prop="location"><el-cascaderv-model="form.location":options="areaOptions":props="{ value: 'name',    // 绑定选项的value字段label: 'name',    // 绑定选项的label字段children: 'children', // 绑定子级字段expandTrigger: 'hover' }"clearable@change="handleAreaChange"placeholder="请选择所在区域"style="width: 100%;"></el-cascader></el-form-item><el-form-item label="详细地址" prop="address"><el-input v-model="form.address" placeholder="请输入详细地址"></el-input></el-form-item><el-form-item label="踏勘时间" prop="expDate"><el-date-pickerv-model="form.expDate"type="date"placeholder="请选择踏勘时间"value-format="yyyy-MM-dd"style="width: 100%;"></el-date-picker></el-form-item><el-form-item label="申请说明" prop="applyState"><el-inputtype="textarea"v-model="form.applyState"placeholder="请输入详细的申请说明":rows="4"></el-input></el-form-item></div><div class="infoAdd"><div class="title" style="margin-top: 20px;">已上传资料</div><div class="items"><!-- 上传的图片 --><div class="itemAdd" v-for="(img, index) in uploadedImages" :key="'img-'+index"><img :src="img.preview" alt="上传图片"><div class="cancel" @click="removeUploadedItem('image', index)">×</div></div><!-- 上传的视频 --><div class="itemAdd" v-for="(video, index) in uploadedVideos" :key="'video-'+index"><video controls width="100" height="80"><source :src="video.preview" :type="video.type">您的浏览器不支持视频预览</video><div class="cancel" @click="removeUploadedItem('video', index)">×</div></div><!-- 上传的文件 --><div class="itemAdd file-item" v-for="(file, index) in uploadedDocs" :key="'file-'+index"><div class="file-icon"><i class="el-icon-document"></i></div><div class="file-name">{{ truncateFileName(file.name) }}</div><div class="cancel" @click="removeUploadedItem('doc', index)">×</div></div></div></div><div class="infoAdd"><div class="title">上传资料</div><div class="upload-container"><div class="upload-item" @click="triggerUpload('img')"><div class="upload-icon">+</div><div class="upload-text">图片</div><input type="file" ref="img" @change="handleImageUpload" hidden accept="image/*" multiple></div><div class="upload-item" @click="triggerUpload('video')"><div class="upload-icon">+</div><div class="upload-text">录像</div><input type="file" ref="video" @change="handleVideoUpload" hidden accept="video/*" multiple></div><div class="upload-item" @click="triggerUpload('file')"><div class="upload-icon">+</div><div class="upload-text">文件</div><input type="file" ref="file" @change="handleFileUpload" hidden multiple></div></div></div><div class="sumBtn"><el-button type="primary" @click="submitForm('form')" size="large">提交</el-button></div></el-form></div>
</template><script>
import chinaRegionData from '@/assets/data/china-region.json';
export default {  name: 'addInfo',data() {// 手机号校验函数const validatePhone = (rule, value, callback) => {if (!value) {return callback(new Error('请输入联系电话'));}if (!/^1[3-9]\d{9}$/.test(value)) {return callback(new Error('请输入正确的手机号码'));}callback();};// 身份证校验函数const validateIdCard = (rule, value, callback) => {if (!value) {return callback(new Error('请输入身份证号'));}// 简单校验18位(实际项目应使用更严格校验)if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(value)) {return callback(new Error('请输入有效的身份证号'));}callback();};return {form: {proposer_Name: '',telephone: '',cardId: '',charterName: '',location: [],address: '',expDate: '',applyState: ''},areaOptions: chinaRegionData,uploadedImages: [], // 上传的图片uploadedVideos: [], // 上传的视频uploadedDocs: []  , // 上传的文件rules: {proposer_Name: [{ required: true, message: '请输入申请人姓名', trigger: 'blur' },{ min: 2, max: 10, message: '长度在2到10个字符', trigger: 'blur' }],telephone: [{ required: true, validator: validatePhone, trigger: 'blur' }],cardId: [{ required: true, validator: validateIdCard, trigger: 'blur' }],charterName: [{ required: true, message: '请输入营业执照名称', trigger: 'blur' }],location: [{ type: 'array', required: true, message: '请选择所在区域', trigger: 'change' }],address: [{ required: true, message: '请输入详细地址', trigger: 'blur' },{ min: 5, max: 100, message: '长度在5到100个字符', trigger: 'blur' }],expDate: [{ required: true, message: '请选择踏勘时间', trigger: 'change' }],applyState: [{ required: true, message: '请输入申请说明', trigger: 'blur' },{ min: 10, message: '至少输入10个字符', trigger: 'blur' }]},}},methods: {handleAreaChange(value) {console.log('Area changed:', value);},triggerUpload(type) {this.$refs[type].click();},handleImageUpload(event) {const files = event.target.files;if (!files || files.length === 0) return;Array.from(files).forEach(file => {if (!file.type.match('image.*')) {this.$message.error(`${file.name} 不是有效的图片文件`);return;}const reader = new FileReader();reader.onload = (e) => {this.uploadedImages.push({file: file,preview: e.target.result,type: file.type});};reader.readAsDataURL(file);});console.log("uploadedImages:"+this.uploadedImages)},handleVideoUpload(event) {const files = event.target.files;if (!files || files.length === 0) return;Array.from(files).forEach(file => {if (!file.type.match('video.*')) {this.$message.error(`${file.name} 不是有效的视频文件`);return;}const reader = new FileReader();reader.onload = (e) => {this.uploadedVideos.push({file: file,preview: e.target.result,type: file.type});};reader.readAsDataURL(file);});console.log("uploadedVideos:"+this.uploadedVideos)},handleFileUpload(event) {const files = event.target.files;if (!files || files.length === 0) return;Array.from(files).forEach(file => {this.uploadedDocs.push({file: file,name: file.name,type: file.type,size: file.size});});this.$message.success(`已添加 ${files.length} 个文件`);console.log("uploadedDocs:"+this.uploadedDocs)},removeUploadedItem(type, index) {if (type === 'image') {this.uploadedImages.splice(index, 1);} else if (type === 'video') {this.uploadedVideos.splice(index, 1);} else {this.uploadedDocs.splice(index, 1);}this.$message.success('已删除');},truncateFileName(name) {if (name.length > 10) {return name.substring(0, 8) + '...';}return name;},submitForm(formName) {this.$refs[formName].validate((valid)=>{if (!valid) {this.$message.error('请检查表单填写是否正确');return false;}// 检查是否上传了文件(如果需要)if (this.uploadedImages.length === 0 && this.uploadedVideos.length === 0 && this.uploadedDocs.length === 0) {this.$message.warning('请至少上传一份资料');return;}console.log("from"+this.form)// Prepare form dataconst formData = new FormData();formData.append('proposer_Name', this.form.proposer_Name);formData.append('telephone', this.form.telephone);formData.append('cardId', this.form.cardId);formData.append('charterName', this.form.charterName);formData.append('location', this.form.location.join('/'));formData.append('address', this.form.address);formData.append('expDate', this.form.expDate);formData.append('applyState', this.form.applyState);formData.append('licenseName',this.$route.query.name)// Add filesthis.uploadedImages.forEach(item => formData.append('img', item.file));this.uploadedVideos.forEach(item => formData.append('video', item.file));this.uploadedDocs.forEach(item => formData.append('file', item.file));console.log("formData:"+this.formData)console.log("uploadedImages:"+this.uploadedImages)console.log("uploadedVideos:"+this.uploadedVideos)console.log("uploadedDocs:"+this.uploadedDocs)// Submit formthis.$axios.post('/api/user/addUser', formData).then(response => {console.log("response.data"+response.data)if(response.data==='success'){this.$message.success('提交成功');this.$router.push({path:'/infoList'})}}).catch(error => {this.$message.error('提交失败');console.error(error);});})}}
}
</script><style scoped>
.content {height: 100%;width: 100%;padding: 20px;box-sizing: border-box;overflow-y: auto;
}.infoAdd {width: 95%;margin: 0 auto;margin-top: 20px;border: 1px solid #EBEEF5;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);padding: 20px;border-radius: 4px;background-color: #fff;
}.title::before {content: '';display: inline-block;width: 4px;height: 14px;background-color: #409EFF;margin-right: 8px;vertical-align: middle;
}.title {font-size: 16px;margin-bottom: 20px;font-weight: bold;color: #303133;
}.items {margin-top: 12px;display: flex;justify-content: flex-start;flex-wrap: wrap;gap: 10px;
}.itemAdd {width: 100px;height: 80px;background-color: #F5F7FA;border: 1px dashed #DCDFE6;border-radius: 4px;display: flex;flex-direction: column;align-items: center;justify-content: center;cursor: pointer;transition: all 0.3s;position: relative;
}.itemAdd:hover {border-color: #409EFF;
}.itemAdd img {width: 100%;height: 100%;object-fit: cover;border-radius: 4px;
}.upload-container {display: flex;justify-content: space-between;margin-top: 15px;
}.upload-item {flex: 1;margin: 0 5px;height: 100px;background-color: #F5F7FA;border: 1px dashed #DCDFE6;border-radius: 4px;display: flex;flex-direction: column;align-items: center;justify-content: center;cursor: pointer;transition: all 0.3s;
}.upload-item:hover {border-color: #409EFF;
}.upload-icon {font-size: 24px;width: 40px;height: 40px;color: #909399;border: 1px solid #DCDFE6;box-sizing: border-box;border-radius: 50%;display: flex;justify-content: center;align-items: center;margin-bottom: 8px;
}.upload-text {font-size: 14px;color: #606266;
}.cancel {position: absolute;font-size: 16px;right: -8px;top: -8px;width: 20px;height: 20px;background: #f56c6c;color: white;border-radius: 50%;display: flex;align-items: center;justify-content: center;cursor: pointer;z-index: 2;
}.file-item {display: flex;flex-direction: column;align-items: center;justify-content: center;
}.file-icon {margin-bottom: 5px;
}.file-icon i {font-size: 30px;color: #409EFF;
}.file-name {font-size: 12px;text-align: center;width: 90px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;
}video {background-color: #000;border-radius: 4px;
}.sumBtn {width: 95%;margin: 30px auto;text-align: center;
}.example {color: #909399;font-size: 14px;
}.el-form-item {margin-bottom: 20px;
}.el-cascader {width: 100%;
}.el-date-editor {width: 100%;
}.el-textarea__inner {min-height: 80px !important;
}
</style>

以下是基于SSM框架的后端实现代码,用于接收前端发送的表单数据和文件,并保存到数据库中的步骤:(在成功创建SSM项目并能启动成功之后)

1.在 pom.xml 中添加文件上传支持库:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>

2.在 spring-mvc.xml 中配置 MultipartResolver:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置编码 --><property name="defaultEncoding" value="UTF-8"/><!-- 最大上传大小(单位:字节) --><property name="maxUploadSize" value="10485760"/> <!-- 10MB --><!-- 内存缓冲大小 --><property name="maxInMemorySize" value="40960"/>
</bean>

还可能需要解决跨域问题:

<!--    配置CORS(跨域资源共享)的设定。它的作用是允许web应用处理来自不同源的跨域请求--><mvc:cors><mvc:mapping path="/**"allowed-origins="*"allowed-methods="GET, POST, PUT, DELETE, OPTIONS"allowed-headers="Content-Type"/></mvc:cors>

3.创建实体类,接收表单数据

@Data
public class User {private int id;private String proposerName;private String licenseName;private String telephone;private String cardId;private String charterName;private String location;private String address;private Date expDate;private String applyState;
}

4.mapper接口

public interface UserMapper {//添加申请人void addUser(User user);//更新申请人void updateUser(@Param("id") Integer id,@Param("type") String type,@Param("filePath") String fliePath);
}

5.mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuankan.mapper.UserMapper"><resultMap id="userMap" type="com.yuankan.pojo.User"><!-- 主键字段使用id标签 --><id property="id" column="id" /><!-- 普通字段使用result标签 --><result property="proposerName" column="proposer_Name" /><result property="licenseName" column="licenseName"/><result property="telephone" column="telephone" /><result property="cardId" column="cardId" /><result property="charterName" column="charterName" /><result property="location" column="location" /><result property="address" column="address" /><result property="expDate" column="expDate" /><result property="applyState" column="applyState" /></resultMap><insert id="addUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">insert into user  values(null,#{proposerName},#{licenseName},#{telephone},#{cardId},#{charterName},#{location},#{address},#{expDate}, #{applyState},null,null,null)</insert><update id="updateUser">update user<set><if test="type=='image'">img = #{filePath},</if><if test="type=='video'">video = #{filePath},</if><if test="type=='file'">file = #{filePath},</if></set>WHERE id = #{id}</update>
</mapper>

6.service接口

public interface UserService {//添加申请人void addUser(User user, List<MultipartFile> images,List<MultipartFile> videos,List<MultipartFile> files);}

7.service接口实现

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;/*** 添加申请人* @param user*/@Overridepublic void addUser(User user, List<MultipartFile> images,List<MultipartFile> videos,List<MultipartFile> files) {//保存申请人信息到数据库userMapper.addUser(user);// 保存上传的文件try {saveUploadedFiles(images, "image", user.getId());saveUploadedFiles(videos, "video", user.getId());saveUploadedFiles(files, "file", user.getId());} catch (IOException e) {throw new RuntimeException("文件保存失败", e);}}/*** 保存上传的文件* @param files 上传的文件* @param type 文件类型* @param id 申请人id* @throws IOException*/private void saveUploadedFiles(List<MultipartFile> files, String type, Integer id) throws IOException {// 如果没有上传文件,则返回if (files == null || files.isEmpty()) return;// 遍历文件列表,保存文件到服务器for (MultipartFile file : files) {String filePath = FileUploadUtil.saveFile(file, type);// 更新数据库中的文件路径userMapper.updateUser(id,type,filePath);}}}

FileUploadUtil工具类:

/*** 文件上传工具类*/
public class FileUploadUtil {// 上传目录private static final String UPLOAD_DIR = "/uploads/";/*** 保存上传的文件* @param file 上传的文件* @param type 文件类型* @return* @throws IOException*/public static String saveFile(MultipartFile file, String type) throws IOException {// 创建上传目录(如果不存在)File uploadDir = new File(UPLOAD_DIR + type);if (!uploadDir.exists()) {// 创建目录uploadDir.mkdirs();}// 生成唯一文件名String fileName = file.getOriginalFilename();//文件路径Path filePath = Paths.get(uploadDir.getAbsolutePath(), fileName);// 保存文件Files.copy(file.getInputStream(), filePath);// 返回文件路径return filePath.toString();}
}

8.Controller层(使用日志记录信息)

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;//获取Logger对象private static  final Logger logger= LogManager.getLogger(UserController.class);@PostMapping("/addUser")public String addUser(@RequestParam String proposer_Name,@RequestParam String telephone,@RequestParam String cardId,@RequestParam String charterName,@RequestParam String[] location, // 地区数组@RequestParam String address,@RequestParam Date expDate,@RequestParam String applyState,@RequestParam String licenseName,@RequestParam(required = false) MultipartFile[] img,@RequestParam(required = false) MultipartFile[] video,@RequestParam(required = false) MultipartFile[] file){// 创建申请人对象User user = new User();user.setProposerName(proposer_Name);logger.info("申请人姓名:"+proposer_Name);user.setTelephone(telephone);logger.info("申请人电话:"+telephone);user.setCardId(cardId);logger.info("申请人身份证号:"+cardId);user.setCharterName(charterName);logger.info("营业执照名称:"+charterName);user.setLocation(String.join("/", location));// 将数组转为字符串logger.info("申请人地址:"+String.join("/", location));user.setAddress(address);logger.info("申请人详细地址:"+address);user.setExpDate(expDate);logger.info("申请人有效期:"+expDate);user.setApplyState(applyState);logger.info("申请说明:"+applyState);user.setLicenseName(licenseName);logger.info("许可证名称:"+licenseName);logger.info("user:"+user);// 处理上传文件List<MultipartFile> images = img != null ? Arrays.asList(img) : null;List<MultipartFile> videos = video != null ? Arrays.asList(video) : null;List<MultipartFile> files = file != null ? Arrays.asList(file) : null;// 添加申请人userService.addUser(user, images, videos, files);return "success";}
}

日志使用:

1.导入依赖:

<!-- Log4j2 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.17.2</version></dependency>

2.编写log4j2.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><!--        <RollingFile name="RollingFile" fileName="logs/ssm.log"-->
<!--                     filePattern="logs/ssm-%d{yyyy-MM-dd}.log">-->
<!--            <PatternLayout>-->
<!--                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>-->
<!--            </PatternLayout>-->
<!--            <Policies>-->
<!--                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>-->
<!--            </Policies>-->
<!--            <DefaultRolloverStrategy max="30"/>-->
<!--        </RollingFile>--></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/>
<!--            <AppenderRef ref="RollingFile"/>--></Root><Logger name="com.it.dao" level="debug"/></Loggers>
</Configuration>

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

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

相关文章

Python 机器学习核心入门与实战进阶 Day 1 - 分类 vs 回归

✅ 今日目标 理解分类&#xff08;Classification&#xff09;与回归&#xff08;Regression&#xff09;的本质区别掌握两种任务的典型使用场景学会根据任务类型选择合适的模型了解每类模型对应的评估指标 &#x1f4d8; 一、监督学习的两大任务类型 任务类型输出结果典型问…

RPC--自定义注解注册发布服务

自定义的三个注解1、RpcReference这个注解用于修饰类的某个字段&#xff0c;表示这个字段是远程调用的引用下面详细解释下这个字段的定义Document表示这个注解应该被javadoc文档工具记录&#xff0c;生成API文档时使用了该注解的地方会被显示出来Retention表示这个注解的声明周…

Web 3D可视化引擎HOOPS Communicator,高效赋能工业级应用开发!

在数字化转型加速的今天&#xff0c;企业面临着前所未有的挑战——如何高效管理跨平台的设计数据、提升团队协作效率&#xff0c;并加快产品上市速度。HOOPS Communicator作为一款高性能的3D可视化与共享平台&#xff0c;凭借其强大的兼容性、先进的3D渲染引擎和无缝的协作功能…

OceanBase数据库迁移工具介绍和部署

OceanBase数据库迁移工具介绍和部署核心组件迁移支持部署要求单节点部署查看日志OceanBase 迁移服务&#xff08;OceanBase Migration Service, OMS&#xff09;是OceanBase数据库提供的一种支持同构或异构数据源与OceanBase数据库之间进行数据交互的服务&#xff0c;具备在线迁…

栈与队列:算法基础的核心差异

理解栈和队列的异同对打好算法基础太重要了&#xff01;它们都是编程和算法中无处不在的线性数据结构&#xff0c;核心区别在于操作数据的顺序。下面我来帮大家清晰梳理它们的异同点&#xff1a;一、相同点都是线性数据结构&#xff1a;数据元素之间逻辑上呈现“一个接一个”的…

HCIA-生成数协议(STP)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 ​ 本篇笔记是根据B站上的视频教程整理而成&#xff0c;感谢UP主的精彩讲解&#xff01;如果需要了解更多细节&#xff0c;可以参考以下视频&#xf…

基于内网穿透技术的Stable+Diffusion+3.5本地化部署与远程图像生成架构

文章目录 前言1. 本地部署ComfyUI2. 下载 Stable Diffusion3.5 模型3. 演示文生图4. 公网使用Stable Diffusion 3.5 大模型4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 在数字内容创作行业中&#xff0c;利用本地化服务器进行人工智能部署的策略正逐步成为优化制作…

私有云平台实战-OpenStack入门体验

目录 #1.1云计算概述 1.1.1什么是云计算 1.1.2云计算的服务模型 1.1.3OpenStack概述 #2.1OpenStack一键部署 2.1.1在线安装 2.1.2使用本地仓库离线安装 2.1.3创建云主机 1.1云计算概述 云计算是一种基于互联网的计算方式&#xff0c;通过网络将共享的软硬件资源和信息按需提供…

专题:2025即时零售与各类人群消费行为洞察报告|附400+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p42808 即时零售的崛起正在重塑消费市场的时间与空间边界。从清晨的第一杯咖啡到深夜的应急零食&#xff0c;消费者的需求不再受限于传统营业时间。与此同时&#xff0c;不同人群的消费习惯呈现出鲜明差异&#xff0c;Z世代沉迷线上娱…

【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)

以下是五大核心算法的重点解析和LeetCode经典题解&#xff0c;包含最优解法和模板代码&#xff1a;一、数组操作&#xff08;双指针/滑动窗口&#xff09;核心思想&#xff1a;通过索引指针高效遍历与操作数组1. 移动零&#xff08;No.283&#xff09;def moveZeroes(nums):slo…

CSS之基础语法一文全解析

CSS之基础语法一文全解析 一、CSS语法核心结构&#xff1a;选择器声明块1.1 基础语法模板1.2 关键组成部分 二、选择器全解析&#xff1a;精准定位目标元素2.1 基础选择器&#xff08;必掌握&#xff09;2.1.1 标签选择器&#xff08;类型选择器&#xff09;2.1.2 类选择器&…

vue 前端动态导入文件 import.meta.glob 导入图片

背景&#xff1a; 在开发过程中&#xff0c;前端会引入资源文件&#xff0c;这里主要是引入图片。在开发环境&#xff0c;导入的图片显示正常&#xff0c;但是打包部署后&#xff0c;导入的图片就不能正常显示。 原因分析&#xff0c;可能有如下几点&#xff1a; 1.图片不能显示…

RocketMQ-Dashboard页面报Failed to fetch ops home page data错误

今天安装RocketMQ-Dashboard&#xff0c;访问主页&#xff0c;页面弹框提示Failed to fetch ops home page data&#xff0c;F12发现控制台输出网络请求跨域。解决&#xff1a;不要用127.0.0.1访问&#xff0c;用localhost就不报错了

0704-0706上海,又聚上了

上次&#xff0c;还是0413&#xff0c;当时写了一篇&#xff0c;下次相见是何时&#xff1f;也鼓励自己下次相见是找到工作&#xff08;实习也算&#xff09;&#xff0c;没想到真找到了&#xff0c;DW App 说到实习&#xff0c;其实没认真投递很多&#xff0c;互联网公司除了阿…

【win电脑-程序CMD自启动问题-开机就自启动-查找原因-解决方式】

【win电脑-程序CMD自启动问题-开机就自启动-查找原因-解决方式】 1&#xff0c;情况说明&#xff1a;2&#xff0c;问题描述1-这是什么窗口 2-原因分析&#xff1a;3-我的努力-尝试解决&#xff1a;1&#xff0c;任务管理器中查看状态2&#xff0c;查看启动文件夹3&#xff0c;…

Go语言实现双Token登录的思路与实现

Go语言实现双Token登录的思路与实现 引言 在现代Web应用中&#xff0c;身份认证是保障系统安全的重要环节。传统的单Token认证方式存在一些安全隐患&#xff0c;如Token泄露可能导致长期风险。双Token机制&#xff08;Access Token Refresh Token&#xff09;提供了更好的安全…

映射阿里云OSS(对象存储服务)

参考&#xff1a;使用阿里云进行OSS对象存储&#xff08;超详细&#xff09; 一文掌握SpringBoot注解之Component 知识文集(1) ConfigurationProperties注解原理与实战 1.配置属性类 AliOssProperties package com.sky.properties;import lombok.Data; import org.springframe…

Java操作word实战

文章目录简介段落页头与页脚页码表格图片批注文本框目录图表简介 Word编程最重要的类是org.apache.poi.xwpf.usermodel.XWPFDocument。涉及的东西十分复杂。而且Apache poi操作word的技术非常不成熟。代码中本身有很多bug。   Maven的依赖为 <dependency><groupId&…

【Flask】flask中get方法和post方法区别

对于post和get在我以前的认知下一直认为是&#xff1a; 前端发送给后端就称为post 前端需要从后端返回就用get 但是在开发过程中发现了不仅仅如此 区别 GET 意图&#xff1a;获取&#xff08;GET&#xff09; 信息。你只是想读取服务器上已经存在的资源&#xff0c;你不打算改变…

Linux sudo升级

应对 Linux sudo 本地提权漏洞&#xff1a;离线升级 Sudo 到安全版本 一、引言 在 Linux 系统中&#xff0c;sudo&#xff08;superuser do&#xff09;是一个非常重要的工具&#xff0c;它允许授权用户以超级用户&#xff08;root&#xff09;的权限执行命令。然而&#xff0c…