JavaWeb学习:Vue+Element-plus实现文件上传

需求:

JavaWeb的购物车系统需要实现新增商品的功能。商品的展示图片需要与商品的基础信息一同上传至服务器,图片保存路径则随基础信息异同保存至数据库。

实现:

前端:

1. 选择相应的文件上传组件:

选择点击按钮手动上传的组件,源代码如下:

<template><el-uploadref="uploadRef"class="upload-demo"action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15":auto-upload="false"><template #trigger><el-button type="primary">select file</el-button></template><el-button class="ml-3" type="success" @click="submitUpload">upload to server</el-button><template #tip><div class="el-upload__tip">jpg/png files with a size less than 500kb</div></template></el-upload>
</template><script lang="ts" setup>
import { ref } from 'vue'
import type { UploadInstance } from 'element-plus'const uploadRef = ref<UploadInstance>()const submitUpload = () => {uploadRef.value!.submit()
}
</script>

后端MultipartFile对应的是前端FormData数据,为成功上传至后端,需要对上传过程进行一些修改,将自定义的上传过程编写在before-upload周期中,返回值为false则不会调用默认的上传方法

<template><el-uploadref="uploadRef"class="upload-demo"action="http://localhost:8090/img/upload":auto-upload="false":name="file":before-upload="handleBeforeUpload"@change="handleChange":limit="1"><template #trigger><el-button type="primary">select file</el-button></template><el-button class="ml-3" type="success" @click="submitUpload">upload to server</el-button></el-upload></template><script  setup>import { ref } from 'vue'import axios from 'axios'const uploadRef = ref()const submitUpload = () => {uploadRef.value.submit()}const file = ref()const handleChange = (e) => {file.value = e.file; // 获取到的文件对象// ...
};const handleBeforeUpload = async (file) => {// 使用axios发送文件前,确保创建FormData实例const formData = new FormData();formData.append('file', file);for (let pair of formData.entries()) {console.log(pair[0] + ', ' + pair[1]);}// 配置axios请求axios({method: 'post',url: 'http://localhost:8090/img/upload',// 上传数据直接为formData实例即可,无需通过JSON封装,否则无法解析!!!data: formData,headers: { 'Content-Type': 'multipart/form-data' }}).then(response => {console.log(response);}).catch(error => {console.log(error);});return false;}</script>

FormData类型的数据无法直接在控制台中log出来,直接log会生成空对象{},用遍历方式便可输出FormData中保存的对象 。

上传数据data直接为formData实例即可,无需通过JSON封装,否则后端无法解析!!!

上传文件一定是POST请求,所以后端也是用@RequestBody注解解析请求数据

部分upload组件传入的属性含义如下:

action:文件上传的请求

auto-upload:文件导入后是否自动上传

limit:限制文件上传的个数

后端:

1. 配置解析器

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.multipart.commons.CommonsMultipartResolver;  
import org.springframework.web.multipart.MultipartResolver;  @Configuration  
public class WebMvcConfig {  @Beanpublic MultipartResolver multipartResolver() {// 使用StandardServletMultipartResolver作为MultipartResolver实现StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();// 可以进一步配置其他属性,例如文件大小限制等,但通常这些在web.xml或通过@MultipartConfig注解在Servlet上进行配置return multipartResolver;}
}

2. 在启动器中初始化解析器的相关信息

配置MultiPartConfigElement这一步很重要!!!因为缺了这一步所以卡了一整天555

具体可参考官方文档:StandardServletMultipartResolver (Spring Framework 6.1.8 API)

    /*** 自定义Servlet注册时的配置,特别是针对文件上传的配置。* 此方法设置上传文件的存储位置、最大文件大小、最大请求大小和文件大小阈值。** @param registration Servlet注册的动态对象,允许在注册时进行额外的配置。*/@Overrideprotected void customizeRegistration(ServletRegistration.Dynamic registration) {// 设置多部分配置元素,包括文件上传的临时存储路径、最大文件大小、最大请求大小和写入磁盘的阈值。registration.setMultipartConfig(new MultipartConfigElement("D:\\coding\\javawebcoding\\javaweb_official_page\\src\\main\\webapp\\img", 1024 * 1024 * 10, 1024 * 1024 * 50, 1024 * 1024));}

3. 配置处理图片上传请求的controller类及handler方法

@RestController
@CrossOrigin(origins = "http://localhost:5173")
// 对解析器进行相关配置
@MultipartConfig(maxFileSize = 1024 * 1024 * 10, maxRequestSize = 1024 * 1024 * 50)
public class FileController {// 文件保存路径:webapp/imgprivate static final String UPLOAD_DIR = "D:\\coding\\javawebcoding\\javaweb_official_page\\src\\main\\webapp\\img"; // 图片保存的目录相对路径/*** 处理图片上传请求。** @param file 用户上传的图片文件,以MultipartFile形式接收。* @return 返回一个Result对象,包含上传结果的状态和消息。*         如果上传成功,返回包含成功消息和文件名的结果;*         如果上传失败,返回包含失败原因的结果。*/@RequestMapping("/img/upload")public Result handleImageUpload(@RequestBody MultipartFile file) {// 检查上传的文件是否为空if (file == null || file.isEmpty()) {return Result.failed("图片上传失败:" + "图片为空");}try {// 读取上传文件的字节byte[] bytes = file.getBytes();// 构建保存路径Path path = Paths.get(UPLOAD_DIR + File.separator + file.getOriginalFilename());// 将文件字节写入指定路径Files.write(path, bytes);return Result.success("图片上传成功:" + file.getOriginalFilename());} catch (IOException e) {e.printStackTrace();// 捕获并处理IO异常,返回失败结果return Result.failed("图片上传失败:" + e.getMessage());}}}

随后文件上传便可以加载到webapp/img中啦!在tomcat设置中on frame deactivation为Update Resource则不需要重新部署文件,便可以从外部通过路径访问新上传的图片。当然通过路径访问静态资源也需要设置相关配置:

    //开启静态资源@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}

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

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

相关文章

【深度学习】温故而知新4-手写体识别-多层感知机+CNN网络-完整代码-可运行

多层感知机版本 import torch import torch.nn as nn import numpy as np import torch.utils from torch.utils.data import DataLoader, Dataset import torchvision from torchvision import transforms import matplotlib.pyplot as plt import matplotlib import os # 前…

wvp-gb28181-pro搭建流媒体服务器,内存占用过高问题

直接给出解决办法&#xff0c;端口暴露的太多了&#xff0c;暴露了500个端口导致从3g---->11g 遇到的问题&#xff0c;直接使用镜像《648540858/wvp_pro:latest》在宿主机上运行,如我下面的博客 https://blog.csdn.net/weixin_41012767/article/details/137112338?spm100…

FASTGPT:可视化开发、运营和使用的AI原生应用

近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI的应用逐渐渗透到各行各业。作为一种全新的开发模式&#xff0c;AI原生应用正逐步成为行业的焦点。在这方面&#xff0c;FASTGPT无疑是一款颇具代表性的产品。本文将详细介绍FASTGPT的设…

面向对象编程高级概念详解

面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;不仅是一种编程范式&#xff0c;更是一种思考和设计软件的方法。本文将深入探讨OOP中的几个核心概念&#xff0c;包括析构函数、深浅拷贝、静态成员、单例模式、操作符重载、友元以及前与后的区别&#x…

Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff0c;如果…

用友NC pagesServlet SQL注入致RCE漏洞复现(XVE-2024-13067)

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术,旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /portal/pt/servlet/pagesServlet/doPost接口…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)

系列文章目录 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;----课程实验环境搭建&#x…

SM国密加密算法简介

国密&#xff08;商密&#xff09;算法算法类型是否公开技术特点应用场景SM1对称密码算法否&#xff0c;需要加密芯片的接口进行调用加密强度与AES相当电子政务/商务&#xff0c;智能IC卡、加密卡等SM2非对称密码算法是基于ECC&#xff0c;签名速度与密钥生成速度快于RSA&#…

Vue3 全屏组件 源码

在Vue 3中&#xff0c;实现了全屏功能的组件&#xff0c;开箱即用。 使用了screenfull依赖库&#xff0c;可以省去浏览器适配的麻烦。 代码如下&#xff1a; <template><div ref"myFullScreen" ><slot></slot></div> </template…

ResizeObserver监听画布尺寸改变动态渲染echarts

前言&#xff1a; 在日常开发中有时遇到同数据相关的业务可能会用到echarts插件。一般在封装echarts组件的时候大家可能都会通过windows对象监听浏览器窗口大小的改变动态渲染echarts,这样当echarts窗口改变导致echarts画布元素大小改变的同时&#xff0c;就能调用相关api进行重…

RocketMQ相关知识知多少

一、RocketMQ的定义 官网网址&#xff1a;领域模型概述 | RocketMQ Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨&#xff0c;RocketMQ 已经成为业内共识的金…

Flink的简单学习二

一 Flink的核心组件 1.1 client 1.将数据流程图DataFlow发送给JobManager。 1.2 JobManager 1.收集client的DataFlow图&#xff0c;将图分解成一个个的task任务&#xff0c;并返回状态更新数据给client 2.JobManager负责作业调度&#xff0c;收集TaskManager的Heartbeat和…

方法调研:DDOS检测有哪些方法?

检测DDoS攻击的方法多种多样,主要可以归纳为以下几类:流量分析、行为分析、协议分析、分布式检测和基于机器学习的方法。每种方法都有其独特的优势和适用场景。以下是这些方法的详细介绍: 1. 流量分析 基线分析 原理:建立正常流量的基线,通过比较当前流量与基线的偏差来…

【Java】--SpringBoot 统一异常处理

目录 统一异常处理 统一异常处理 通过使用注解ControllerAdvice&#xff08;控制器通知类&#xff09;ExceptionHandler&#xff08;异常处理器&#xff09;来实现&#xff0c;两个结合表示出现异常的时候执行某个通知&#xff0c;即执行某个方法事件。 对应的异常类执行对应…

三、基于图像分类预训练编码及图神经网络的预测模型 【框图+源码】

背景&#xff1a; 抽时间补充&#xff0c;先挖个坑。 一、模型结构 二、源码

美团一面:什么是CAS?有什么优缺点?我说你说的是AtomicInteger吗?

引言 传统的并发控制手段&#xff0c;如使用synchronized关键字或者ReentrantLock等互斥锁机制&#xff0c;虽然能够有效防止资源的竞争冲突&#xff0c;但也可能带来额外的性能开销&#xff0c;如上下文切换、锁竞争导致的线程阻塞等。而此时就出现了一种乐观锁的策略&#x…

解析Java中1000个常用类:ProcessHandle.Info类,你学会了吗?

效率工具 推荐一个程序员常用的工具网站:程序员常用工具(http://tools.cxyroad.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。云服务器 云服务器限时免费领:轻量服务器2核4G腾讯云:2核2G4M云服务器新老同享99元/年,续费同价阿…

企业数字化转型的测度难题:基于大语言模型的新方法与新发现

《经济研究》新文章《企业数字化转型的测度难题&#xff1a;基于大语言模型的新方法与新发现》运用机器学习和大语言模型构造一套新的企业数字化转型指标。理论分析和数据交叉验证均表明&#xff0c;构建的指标相对已有方法更准确&#xff1a; 1.第一步&#xff1a;选择“管理…

17.Redis之主从复制

1.主从复制是怎么回事&#xff1f; 分布式系统, 涉及到一个非常关键的问题: 单点问题 单点问题&#xff1a;如果某个服务器程序, 只有一个节点(只搞一个物理服务器, 来部署这个服务器程序) 1.可用性问题,如果这个机器挂了,意味着服务就中断了~ 2.性能/支持的并发量也是比较有限…

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解 针对权限等级&#xff0c;相对于主体来说&#xff0c;会有不同的细分概念。 一、权限APL等级&#xff1a; 首先在鸿蒙系统中&#xff0c;对于权限本身&#xff0c;分为三个等级&#xff1a;normal&#xff0c;s…