Vue + SpringBoot:el-upload组件单文件、多文件上传实战解析

news2024/11/19 14:40:58

文章目录

  • 单文件上传
    • 后端
    • 前端
  • 多文件上传
    • 后端
    • 前端

单文件上传

后端

@PostMapping("/uploadDxfFile")
public R uploadDxfFile(@RequestParam(value = "file", required = true) MultipartFile multipartFile) throws Exception {
	// 文件校验工作
    if (multipartFile.isEmpty() || multipartFile.getSize() > 52428800) {
        R.fail(BaseErrorCode.CLIENT_ERROR.code(), "上传文件不能为空,且不能大于50MB");
    }
    // 获取文件名
    String originalFilename = multipartFile.getOriginalFilename();
    if (!(originalFilename.endsWith(".dxf"))) {
        return R.fail(BaseErrorCode.CLIENT_ERROR.code(), "只能导入dxf文件");
    }

	// 获取文件输入流
    InputStream inputStream = multipartFile.getInputStream();
   
    return R.ok(resultMap);
}

前端

在这里插入图片描述
【组件】

<el-upload class="upload-demo" :action="uploadDxfAction" :data="uploadPostData"
           :on-preview="handlePreview"
           :on-remove="handleRemove" :before-remove="beforeRemove" :on-success="handleSuccess"
           :headers="headers" :limit="1" :on-exceed="handleExceed" :file-list="fileList"
           style=" width: 100%;">
  <el-button size="mini" type="primary">上传dxf文件</el-button>
  <div slot="tip" class="el-upload__tip" style="color: red;">
    只能上传.dxf文件,且不超过50MB
  </div>
</el-upload>
  • :action="uploadDxfAction":定义文件要上传到的后台接口地址
  • :limit="1":限制只能上传一个文件
  • :on-success="handleSuccess":定义文件上传成功时执行的方法
  • :headers="headers":如果后台做了权限验证,需要在这里定义文件上传时的请求头’

【变量定义】

 data() {
    return {
      // token
      token: '',
      // 请求头
      headers: {},
      passengerFlowImportDialogVisible: false,
      // 文件上传地址(后端接受文件的地址)
      uploadDxfAction: process.env.VUE_APP_BASE_API + "/packing/item/uploadDxfFile",
      // 文件列表
      fileList: [],
      // 导入文件的同时向后台提交数据
      uploadPostData: {},
      /// 批量上传物品
      uploadItemList: [],
      // 设置所导入零件参数的时候,点击到的行
      selectRow: {},
    };
  },

【方法定义】

handleSuccess(res) {
	console.log("文件上传成功");
  console.log("res:" + JSON.stringify(res.data.code));
  // 这里可以定义一些文件上传成功之后的操作,例如成功提示、文件信息解析……
},

handleRemove(file, fileList) {
  console.log(file, fileList);
},
handlePreview(file) {
  console.log(file);
},
handleExceed(files, fileList) {
  this.$message.warning(
    `只能选择 1 个文件,如果想要更换文件,请删除原有文件`
  );
},
beforeRemove(file, fileList) {
  return this.$confirm(`确定移除 ${file.name}`);
},
// 清除已经上传的文件
clearFileList() {
  this.fileList = [];
},
handleChange(file, fileList) {
  this.fileList = fileList;
},

多文件上传

后端

/**
 * 导入一组dxf文件并完成解析
 *
 * @param multipartFiles 文件列表
 * @param paramMap       额外参数映射
 * @return 返回结果
 * @throws Exception 异常
 */
@PreAuthorize("@ss.hasPermi('packing:item:uploadDxfFiles')")
@Log(title = "上传dxf文件组", businessType = BusinessType.IMPORT)
@PostMapping("/uploadBatchDxfFile")
public R uploadBatchDxfFile(@RequestParam(value = "files", required = true) List<MultipartFile> multipartFiles, @RequestParam(required = false) Map paramMap) throws Exception {
    if (multipartFiles.isEmpty()) {
        return R.fail(BaseErrorCode.CLIENT_ERROR.code(), "上传文件组不能为空");
    }

    // 解析出每个文件
    List<Item> items = multipartFiles.stream()
            .filter(file -> !file.isEmpty() && file.getSize() <= 52428800 && file.getOriginalFilename().endsWith(".dxf"))
            .map(file -> {
                try {
					// 处理文件
                } catch (Exception e) {
                    throw new RuntimeException("解析文件出错:" + file.getOriginalFilename(), e);
                }
            })
            .collect(Collectors.toList());

    if (items.isEmpty()) {
        return R.fail(BaseErrorCode.CLIENT_ERROR.code(), "没有有效的dxf文件被上传");
    }

    HashMap<String, Object> resultMap = new HashMap<>();
    resultMap.put("items", items);
    return R.ok(resultMap);
}

前端

在这里插入图片描述

<el-upload ref="batchUpload" class="upload-demo" :action="uploadBatchDxfAction" :data="uploadPostData"
          :on-preview="handlePreview"
          :on-remove="handleRemove" :before-remove="beforeRemove" :on-success="handleBatchSuccess"
          :headers="headers" multiple :on-exceed="handleExceed" :file-list="fileList"
          :on-change="handleChange"
          :auto-upload="false"
          style="width: 100%;">
	<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
	<el-button style="margin-left: 10px;" size="small" type="success" @click="submitBatchUpload">上传解析
	</el-button>
	<div slot="tip" class="el-upload__tip" style="color: red;">
	  只能上传.dxf文件,每个文件不超过50MB
	</div>
</el-upload>

首先需要关闭自动上传:auto-upload="false",不然所选择的文件会被一个一个上传,我们希望同时将这些文件上传到服务器进行处理。
变量定义、方法定义和上面类似,这里只展示不一样的。在选取完文件之后,并不会自动上传到服务器,需要点击按钮手动上传,如果直接调用el-upload的提交方法,还是会一个一个文件的上传,因此我们需要自己写一个请求方法,我的请求方法如下:

import axios from 'axios'
// 批量上传文件
export function uploadBatchDxfFile(fileList, token) {
  const formData = new FormData();
  // 遍历文件列表,将每个文件添加到formData中
  fileList.forEach((file, index) => {
    // 你可以选择使用一个通用的键名(如'files'),并让后端处理多个同名的键值
    // 或者为每个文件使用唯一的键名,这取决于你的后端需求
    formData.append(`files`, file.raw, file.name); // 这里的`files`是后端期望的字段名
  });

  return axios.post(process.env.VUE_APP_BASE_API + '/packing/item/uploadBatchDxfFile', formData, {
    headers: {
      'Content-Type': 'multipart/form-data',
      Authorization: `Bearer ${token}`
    }
  }).then(response => {
    // 处理成功的响应
    return response.data;
  }).catch(error => {
    // 处理错误情况
    throw error;
  });
}

注意需要给vue项目引入axios,才能使用上面的请求方法。最终在页面中给按钮触发事件绑定下面的方法即可

/**
 * 将选中的文件批量上传
 */
submitBatchUpload() {
  if (this.fileList.length === 0) {
    this.$modal.msgWarning("请先选择文件再上传解析");
    return;
  }
  uploadBatchDxfFile(this.fileList, this.token).then(res => {
 
  })
},

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

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

相关文章

类和对象深入理解

目录 static成员概念静态成员变量面试题补充代码1代码2代码3如何访问private中的成员变量 静态成员函数静态成员函数没有this指针 特性 友元友元函数友元类 内部类特性1特性2 匿名对象拷贝对象时的一些编译器优化 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接…

Qtgui编程基础

Qt简介 ( 框架5.9.8版本 ) Qt是源代码级的跨平台一次编写到处编译.一次开发的Qt应用程序可以移值到不同平台. Qt体系架构 Qt的整个设计都是以单根继承为主这跟java相同.所谓单根继承就是说所有的Qt类都有一个共同的祖先都是QObject类QObject类后面有三个大的子类分别负责不同…

厌倦了Nvim、vim等命令行编辑器?来看看新血脉....

是否厌倦了那几款烂大街的命令行风格编辑器&#xff1f;今天就来给各位换换血&#xff0c;介绍几个新成员。 让我们深入了解这些文本编辑器的主要功能和优点&#xff1a; 1. Ox Editor&#xff1a;优雅的新秀 Ox Editor是一款新兴的终端文本编辑器&#xff0c;以其简洁和优雅…

汽车IVI中控开发入门及进阶(三十三):i.MX linux开发之开发板

前言: 大部分物料/芯片,不管MCU 还是SoC,都会有原厂提供配套开发板,有这样一个使用原型,在遇到问题时或者进行开发时可以使用。 i.MX 8QuadXPlus MEK board: 1、要测试display显示器,可使用i.MX mini SAS将“LVDS1_CH0”端口连接到LVDS到HDMI适配器的cable。 2、要测试…

接口参数化--代码支撑参数

如果测试的用例里传动态参数&#xff0c;就需要把列出规则&#xff0c;然后在代码里运用前期是把动态参数都列出了&#xff0c;现在需要运用 步骤&#xff1a; 先excel表中定义规范&#xff0c;将请求参数里的时间戳定义规则&#xff08;规范也需要提前写出&#xff09; 建立…

库表设计(基础)-实体与设计关系

实体关系分析 1 实体关系是指系统事务之间的联系。 2 实体关系需要双向分析。 3 实体关系决定表关系。 实体关系的种类 1 一对一 2 一对多 3 多对多 举例&#xff1a; 上面关系如下&#xff1a; 班级和学生 &#xff1a; 1:N 学生和课程&#xff1a;N : N 学生和学籍档案&a…

【MotionCap】pycharm 远程在wsl2 ubuntu20.04中root的miniconda3环境

pycharm wsl2 链接到pycharmsbin 都能看到内容,/root 下内容赋予了zhangbin 所有,pycharm还是看不到/root 下内容。sudo 安装了miniconda3 引发了这些问题 由于是在 root 用户安装的miniconda3 所以安装路径在/root/miniconda3 里 这导致了环境也是root用户的,会触发告警 WA…

温州网站建设方案及报价

随着互联网的发展&#xff0c;网站建设已经成为企业推广和营销的重要手段。温州作为中国经济发达地区之一&#xff0c;各行各业企业纷纷意识到网站建设的重要性&#xff0c;纷纷加大网站建设工作的投入。那么&#xff0c;温州网站建设方案及报价是怎样的呢&#xff1f;下面我们…

昇思25天学习打卡营第10天|ResNet50迁移学习

文章目录 昇思MindSpore应用实践基于MindSpore的ResNet50迁移学习1、迁移学习简介2、加载ImageNet数据集数据集可视化 3、ResNet50 模型4、模型训练固定特征进行训练 5、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 基于…

AI革命:RAG技术引领未来智能

AI革命:RAG技术引领未来智能 在人工智能的浪潮中,一种名为RAG(Retrieval-Augmented Generation)的技术正在悄然改变我们的世界。这种技术通过整合外部知识库,极大地增强了大型语言模型(LLM)的性能,为智能助手、聊天机器人等应用带来了革命性的提升。 1 突破性的RAG技…

迈威通信本安Wi-Fi 6工业无线AP系列,促进井下无线全覆盖

在现代化的工业生产中&#xff0c;无线通信技术的应用日益广泛。特别是对于矿井等复杂环境&#xff0c;传统的有线通信方式往往面临着布线困难、维护成本高、灵活性差等问题。为了解决这些难题&#xff0c;迈威通信推出了本安Wi-Fi 6工业无线AP系列&#xff0c;以其卓越的性能和…

《C++20设计模式》外观模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 一句话总结外观模式&#xff1a;简化接口&#xff0c;或者简化流程。&#x1f642; 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_modern_Cpp_20 二、实现 原来需要很…

idea MarketPlace插件找不到

一、背景 好久没用idea了&#xff0c;打开项目后没有lombok&#xff0c;安装lombok插件时发现idea MarketPlace插件市场找不到&#xff0c;需要重新配置代理源&#xff0c;在外网访问时通过代理服务进行连接 二、操作 ### File-->setting 快捷键 Ctrl Alt S 远端源地…

怎么做外贸推广:10个详细教程和工具

1. 介绍 1.1 什么是外贸推广 外贸推广指的是将产品或服务推广到国际市场的过程。它的主要目的是吸引海外客户&#xff0c;增加销售额&#xff0c;并扩大企业的全球影响力。外贸推广不仅仅是销售产品&#xff0c;它还包括品牌建设、市场研究和客户关系管理。 谷歌外贸推广案例…

实战干货,企业在数字化转型中如何通过最佳实践落地BI报表?

引言&#xff1a;上一篇文章我们提到&#xff1a;通过9大步骤&#xff0c;帮助企业在数字化转型中搭建数据分析的报表体系&#xff01;在实际中的落地过程&#xff0c;通过实施服务的哪些最佳实践可以确保落地效果&#xff0c;达到项目预期目标&#xff0c;给客户带来实质价值&…

MySQL索引教程(01):创建索引

文章目录 MySQL 创建索引索引介绍MySQL CREATE INDEX 语法MySQL 索引类型MySQL CREATE INDEX 实例结论 MySQL 创建索引 对于一个具有大量数据行的表&#xff0c;如果你根据某个查询条件检索数据时很慢&#xff0c;可能是因为你没有在检索条件相关的列上创建索引。 索引类似于…

小红书矩阵系统源码:赋能内容创作与电商营销的创新工具

在内容驱动的电商时代&#xff0c;小红书凭借其独特的社区氛围和用户基础&#xff0c;成为品牌营销和个人创作者不可忽视的平台。小红书矩阵系统源码&#xff0c;作为支撑这一平台的核心技术&#xff0c;提供了一系列的功能和优势&#xff0c;助力用户在小红书生态中实现更高效…

2024年APMCM亚太杯中文赛A题——飞行器外形的优化问题

飞行器外形的优化问题 解题思路问题一第一问结果第一问代码 完整答案 本篇文章为大家分享2024年APMCM亚太杯中文赛A题——飞行器外形的优化问题的解题思路以及第一问的完整求解代码与结果&#xff0c;四问的完整解答请看文章最后&#xff01; 解题思路 飞行器是在大气层内或大…

zxing-cpp+OpenCV根据字符串生成条形码

编译构建 需要使用到 CMake、Git、GCC 或 MSVC。 github 链接&#xff1a;https://github.com/zxing-cpp/zxing-cpp 编译之前请确保&#xff1a; 确保安装了 CMake 版本 3.15 或更高版本。 确保安装了与 C17 兼容的编译器(最低VS 2019 16.8 / gcc 7 / clang 5)。 编译构建…

力扣习题--找不同

目录 前言 题目和解析 1、找不同 2、 思路和解析 总结 前言 本系列的所有习题均来自于力扣网站LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目和解析 1、找不同 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t…