SpringBoot+Vue3实现上传文件功能

   2023-02-07 学习力0
核心提示:目录前言一、后端二、前端三、演示前言开发后台系统时经常遇到实现上传文件的功能,在这记录一下我的方法后端:SpringBoot2前端:Vue3+ElementPlus工具:IDEA一、后端/** * 上传采购合同PDF * * @author Leo高洋 * @create 2023-01-20 6:51 */@PostMapping("/

前言

开发后台系统时经常遇到实现上传文件的功能,在这记录一下我的方法

后端:SpringBoot2
前端:Vue3+ElementPlus
工具:IDEA

一、后端

/**
     * 上传采购合同PDF
     *
     * @author Leo高洋
     * @create 2023-01-20 6:51
     */
    @PostMapping("/uploadContract")
    public Map<String, Object> uploadContract(MultipartFile file) throws Exception {
        Map<String, Object> resultMap = new HashMap<>();
        if (!file.isEmpty()) {
            logger.info("上传采购合同PDF");
            String originalFilename = file.getOriginalFilename();// 获取文件名称
            String fileName = originalFilename.substring(0, originalFilename.indexOf("."));// 获取前缀
            String suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));// 获取后缀
            String newFileName = fileName + "-" + DateUtil.getCurrentDatePath() + suffixName;// 根据上传时间重新命名合同
            // 根据定义的位置存入合同
            FileUtils.copyInputStreamToFile(file.getInputStream(), new File(contractPdfFilePath + newFileName));
            resultMap.put("code", 0);
            resultMap.put("msg", "上传成功");
            Map<String, Object> dataMap = new HashMap<>();
            dataMap.put("title", newFileName);
            resultMap.put("data", dataMap);
        }
        return resultMap;
    }

此处使用SpringMVC上传文件的MultipartFile工具类,该工具类具体接口方法,此处只演示简单的使用,有兴趣可以查看 MultipartFile工具类(方法详解)这篇文章。
定义方法时,需传入参数,参数类型MultipartFile,我在这里加入判断文件是否为空的操作,可自行修改。

file.getOriginalFilename(); 获取文件的名称originalFilename.substring(0, originalFilename.indexOf(“.”)); 截取前缀originalFilename.substring(originalFilename.lastIndexOf(“.”)); 获取后缀,及文件类型fileName + “-” + DateUtil.getCurrentDatePath() + suffixName; 根据上传时间重新命名文件FileUtils.copyInputStreamToFile(file.getInputStream(), new File(contractPdfFilePath + newFileName)); 根据定义的位置存入合同

此处的 contractPdfFilePath 为提前定义好的位置,我是在application.yml文件中全局配置,然后在控制器中引入,如下:

application.yml:

contractPdfFilePath: E://2023GraduationDesign/uploadFile/AssetPurchaseContract/

Controller:

@Value("${contractPdfFilePath}")
private String contractPdfFilePath;

配置好便可直接使用,也可以直接在控制器中定义!为了方便前段时间是否上传成功,将文件名称传入Map集合返回前端,即:

Map<String, Object> dataMap = new HashMap<>();
dataMap.put("title", newFileName);

大体流程如上,后端完成!

:此处上传文件有个缺陷,就是选择文件之后立刻上传指定位置,如果在实际应用中发现文件上传错了,重新选择时前文件已在指定文件夹,没有覆盖,个人感觉无伤大雅,但是在前端的回显文件名称时会覆盖新文件名称。

补充:上面代码中在拼接新文件名称时有DateUtil.getCurrentDatePath()方法,是我封装的日期工具类获取当前时间,有兴趣可以自己研究下,这里不过多赘述,代码贴在下方。或者重命名可以随便根据自己的喜好设计,也可以不用重命名。

package com.project.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期工具类
 */
public class DateUtil {

	/**
	 * 日期对象转字符串
	 * @param date
	 * @param format
	 * @return
	 */
	public static String formatDate(Date date,String format){
		String result="";
		SimpleDateFormat sdf=new SimpleDateFormat(format);
		if(date!=null){
			result=sdf.format(date);
		}
		return result;
	}
	
	/**
	 * 字符串转日期对象
	 * @param str
	 * @param format
	 * @return
	 * @throws Exception
	 */
	public static Date formatString(String str,String format) throws Exception{
		if(StringUtil.isEmpty(str)){
			return null;
		}
		SimpleDateFormat sdf=new SimpleDateFormat(format);
		return sdf.parse(str);
	}
	
	public static String getCurrentDateStr(){
		Date date=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddhhmmssSSSSSSSSS");
		return sdf.format(date);
	}
	
	public static String getCurrentDatePath()throws Exception{
		Date date=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
		return sdf.format(date);
	}
	
	public static void main(String[] args) {
		try {
			System.out.println(getCurrentDateStr());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

二、前端

SpringBoot+Vue3实现上传文件功能

<!-- 上传合同 -->
        <el-form-item label="上传合同" prop="cght">
          <el-upload
                  class="upload-demo"
                  :herders="headers"
                  :action="getServerUrl()+'asset/uploadContract'"
                  :limit="1"
                  :show-file-list="false"
                  :on-success="handleContractSuccess"
          >
            <el-row>
              <el-button type="primary">添加采购合同</el-button>
              <span style="font-size: 13px;color: #8d8d8d;margin-left: 15px">{{ fileName }}</span>
            </el-row>
          </el-upload>
        </el-form-item>

这里面:action中的getServerUrl()为自己封装的axios方法,表示http://localhost:8082/。可以直接写。

  • 拼接url:getServerUrl()+‘asset/uploadContract’
  • handleContractSuccess:自定义上传成功的方法

handleContractSuccess方法:

const fileName = ref("只允许上传PDF文件")
const handleContractSuccess = (res) => {
  fileName.value = res.data.title;
  form.value.cght = res.data.title;
}

上传成功时,右侧 “只允许上传PDF文件” 替换为文件名称,并且将文件名称传入定义的属性中,上传数据库。

三、演示

SpringBoot+Vue3实现上传文件功能

SpringBoot+Vue3实现上传文件功能

SpringBoot+Vue3实现上传文件功能

可以看到文件上传成功,上传到指定位置并且重命名在表单成功显示

流程如上,前端完成!

原文地址:https://blog.csdn.net/m0_59420288/article/details/128768843
 
标签: vue3 springboot 上传
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • vue3+TS 自定义指令:长按触发绑定的函数
    vue3+TS 自定义指令:长按触发绑定的函数而然间看到一个在vue2中写的长按触发事件的自定义指定,想着能不能把他copy到我的vue3项目中呢。编写自定义指令时遇到的几个难点1.自定义指令的类型在ts中写任何东西都要考虑到类型的问题,自定义指令的类型问题依然存
    03-08
  • Vue3 企业级优雅实战 - 组件库框架 - 9 实现组
    上文搭建了组件库 cli 的基础架子,实现了创建组件时的用户交互,但遗留了 cli/src/command/create-component.ts 中的 createNewComponent 函数,该函数要实现的功能就是上文开篇提到的 —— 创建一个组件的完整步骤。本文咱们就依次实现那些步骤。(友情提示
    03-08
  • vue3和百度地图关键字检索 定位 点击定位
    vue3和百度地图关键字检索 定位 点击定位
    效果图在index.html中引入百度地图开放平台  去申请你的ak 非常的简单可以自己百度 一下!-- 这个用官网给的有好多警告 更具百度的把 https://api.map.baidu.com/getscript?v=2.0ak=xxxxxxxxxxxxxxxxxxxxx 换为这个就没有那么多 报错了 --scripttype="text/j
    03-08
  • Vue3+TypeScript 项目中,配置 ESLint 和 Prett
    接上篇:从0搭建vite-vue3-ts项目框架:配置less+svg+pinia+vant+axios文档同步项目gitee:https://gitee.com/lixin_ajax/vue3-vite-ts-pinia-vant-less.git 一、Eslint:用于检测代码安装eslint相关依赖yarn add eslint eslint-plugin-vue @typescript-esli
    03-08
  • 一文带你了解Vue3中toRef和toRefs的用法 vue $refs的用法
    一文带你了解Vue3中toRef和toRefs的用法 vue $r
    toRef 顾名思义,不是ref 响应式数据,给它转成ref 响应式数据通俗易懂的理解: templateh3姓名:{{ person.name }}/h3h3年龄:{{ person.age }}/h3h3薪资:{{ person.job.j1.salary }}/h3button @click="person.name += '!'"修改姓名/buttonbutton @click="
    03-08
  • vue3.0 vue-router4.0打包后页面空白的解决方法
    vue3.0 vue-router4.0打包后页面空白的解决方
    开发环境可以正常渲染页面,路由跳转都没有问题,但是打包之后本地打开index.html出现报错或者页面空白的情况:脚手架版本:vue-router版本:第一种报错-资源加载失败这种错误是因为vue.config.js的配置里面 publicPath写了绝对路径,生产环境改为./相对路径
    03-08
  • vue3日历控件的具体实现 vue日历组件如何显示节日
    vue3日历控件的具体实现 vue日历组件如何显示节
    很多地方都要用到日历控件,比如生日、出发到达日期等等,本文就来介绍一下vue3日历控件的具体实现,具体如下效果如下:templatediv class="cal_con" style="margin-left:200px"div class="cal_header"!-- 顶部左侧 --div class="cal_header_left"div class="
    03-08
  • vue3全局组件自动注册功能实现 vue 全局注册
    vue3全局组件自动注册功能实现 vue 全局注册
    目录vue3全局组件自动注册前言:补充: Vue3注册全局组件1.注册单个全局组件2.批量注册全局组件vue3全局组件自动注册前言:本文主要讲述vue3的全局公共组件的自动注册第一步:建文件需要在src/components 下创建一个文件夹用于存放封装的公共组件(这里我起
    03-08
  • vue3项目目录结构示例详解 vue3.0目录结构
    目录一、vue3项目的目录结构详解二、部分主要文件详解1、index.html2、main.js(main.ts)3. package.json三、其他说明1. node版本错误2. 如何调用全局属性3. vue文件中应用vue3.0的api总结一、vue3项目的目录结构详解node_modules:通过 npm install 下载安
    03-08
  • vue3之Suspense加载异步数据的使用
    vue3之Suspense加载异步数据的使用
    Suspense使用templateSuspensetemplate #defaultProductList/ProductList/templatetemplate #fallback divloading.../div /template/Suspense/templatescript setup lang="ts" name="Cart"import ProductList from "./ProductList.vue";/scripts
    03-08
点击排行