上传文件前后端处理【vue3 + springboot】

news2024/11/24 15:38:11

前端

1.处理modal框

<template>
  <n-modal
    v-model:show="modalVisible"
    preset="card"
    :title="title"
    class="w-700px"
  >
    <n-space class="w-full pt-16px" :size="24" justify="end">
      <n-button class="w-72px" @click="closeModal">取消</n-button>
      <n-button class="w-72px" type="primary" @click="handleSubmit"
        >确定</n-button
      >
    </n-space>
  </n-modal>
</template>

<script setup lang="ts">
import { computed } from "vue";

const title = "上传作业"

interface Props {
  /** 弹窗可见性 */
  visible: boolean;
}

const props = withDefaults(defineProps<Props>(), {
  visible: false,
});

interface Emits {
  (e: "update:visible", visible: boolean): void;
}

const emit = defineEmits<Emits>();

const modalVisible = computed({
  get() {
    return props.visible;
  },
  set(visible) {
    emit("update:visible", visible);
  },
});
const closeModal = () => {
  modalVisible.value = false;
};

const handleSubmit = () => {
    window.$message?.success('上传成功')
    closeModal()
}

</script>

<style scoped></style>

为方便使用Boolean类型,特设置为函数useBoolean

import { ref } from 'vue';

/**
 * boolean组合式函数
 * @param initValue 初始值
 */
export default function useBoolean(initValue = false) {
  const bool = ref(initValue);

  function setBool(value: boolean) {
    bool.value = value;
  }
  function setTrue() {
    setBool(true);
  }
  function setFalse() {
    setBool(false);
  }
  function toggle() {
    setBool(!bool.value);
  }

  return {
    bool,
    setBool,
    setTrue,
    setFalse,
    toggle
  };
}

父组件中导入子组件

<template>
<button @click="upload ">上传文件</button>
    <upload-file v-model:visible="uploadVisble"></upload-file>
  </n-card>
</template>

<script setup lang="ts">
const { bool: uploadVisble, setTrue: openUploadModal } = useBoolean();
const upload = () => {
  openUploadModal()
};
</script>

<style scoped></style>

模态框实现效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1BiUki9-1672987453020)(assets/image-20230106130839-hxbe5jz.png)]

2.导入上传文件组件

大体组件

设置最多可支持多少个文件上传,这里我选择的是一个

    <n-upload @before-upload="uploadFile"  :max="1">
      <n-upload-dragger abstract>
        <n-text style="font-size: 16px">
          点击或者拖动文件到该区域来上传
        </n-text>
      </n-upload-dragger>
    </n-upload>

<script setup lang="ts">
const uploadFile = (options: { file: UploadFileInfo }) => {
    let file = options.file.file
    console.log('file',file)
}
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TYZqDQT-1672987453021)(assets/image-20230106131702-8u9leur.png)]

传递数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCpPz8fO-1672987453021)(assets/image-20230106132002-4vu9okd.png)]

这是我需要传给后端的数据

添加jobId

interface Props {
  /** 弹窗可见性 */
  visible: boolean;
  /** 作业Id */
  jobId:number
}

const props = withDefaults(defineProps<Props>(), {
  visible: false,
  jobId:-1
});

父组件中传值

    <upload-file v-model:visible="uploadVisble" :job-id="activeJobId"></upload-file>
<script setup lang="ts">

const activeJobId = ref(-1)

const upload = (row: JobDTO.jobList) => {
  activeJobId.value = row.pkJId
  openUploadModal()
  window.$message?.info(`上传文件${row.pkJId}-${row.jName}`);
};
</script>

其他需要的数据和上面一致

3.请求接口

仅需要传入参数form即可

export function uploadFile(form:FormData){
    return web.post('/job/upload',form)
}

后端

1.定义接数据的类

package com.leo.springbootbackend.pojo.vo;

public class UploadFile {
    private String dirName;
    private Integer jobId;
    private Integer userId;
    private Integer classId;
    private String userNum;
    private String userName;

    @Override
    public String toString() {
        return "UploadFile{" +
                "dirName='" + dirName + '\'' +
                ", jobId=" + jobId +
                ", userId=" + userId +
                ", classId=" + classId +
                ", userNum='" + userNum + '\'' +
                ", userName='" + userName + '\'' +
                '}';
    }

    public String getDirName() {
        return dirName;
    }

    public void setDirName(String dirName) {
        this.dirName = dirName;
    }

    public Integer getJobId() {
        return jobId;
    }

    public void setJobId(Integer jobId) {
        this.jobId = jobId;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getClassId() {
        return classId;
    }

    public void setClassId(Integer classId) {
        this.classId = classId;
    }

    public String getUserNum() {
        return userNum;
    }

    public void setUserNum(String userNum) {
        this.userNum = userNum;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public UploadFile(String dirName, Integer jobId, Integer userId, Integer classId, String userNum, String userName) {
        this.dirName = dirName;
        this.jobId = jobId;
        this.userId = userId;
        this.classId = classId;
        this.userNum = userNum;
        this.userName = userName;
    }
}

2.修改后端最大请求空间大小

resources->application.yaml中添加下列配置

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

3.创建Dao层

    void insertJobInfo(UploadFile formData);

4.处理service

接口

    void uploadFile(MultipartFile file, UploadFile formData);

实现

    @Override
    public void uploadFile(MultipartFile uploadFile, UploadFile formData) {
        String dirName = formData.getDirName();
        String fileName = formData.getUserNum() + " " + formData.getUserName() ;
//        处理后缀
        String oldName = uploadFile.getOriginalFilename();
        fileName += oldName.substring(oldName.lastIndexOf("."));

        File dir = new File(filePath + dirName);
        if(!dir.isDirectory()){
            dir.mkdirs();
        }
//        覆盖
        File override = new File(dirName , fileName);
        if(override.exists()){
            return;
        }
        try {
            uploadFile.transferTo(new File(dir , fileName));
            jobDao.insertJobInfo(formData);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

5.添加controller方法

形参

@RequestParam("File") MultipartFile file, UploadFile formData

实现方法

    @PostMapping("/upload")
    public CommonResult<Object> uploadFile(@RequestParam("File") MultipartFile file, UploadFile formData){
        LocalDateTime localDateTime = LocalDateTime.now();
        formData.setSubmitTime(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        jobService.uploadFile(file, formData);
        return new CommonResult<>(200, "创建成功");
    }

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

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

相关文章

python数据分析:采集分析岗位数据,看看薪资的高低都受什么因素影响呢

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 在我们学习的时候,通常会产生疑问:这个行业前景好不好呢? 今天我们就用python的数据分析这个就业方向来举例 看一下都有哪些因素影响了薪资的高低呢&#xff1f; 数据采集 模块使用: reques…

这些js原型及原型链面试题你能做对几道

一、前言 在面试过程中&#xff0c;频频被原型相关知识问住&#xff0c;每次回答都支支吾吾。后来有家非常心仪的公司&#xff0c;在二面时&#xff0c;果不其然&#xff0c;又问原型了&#xff01; 我痛下决心用了两天时间钻研了下原型&#xff0c;弄明白后发现世界都明亮了…

Spark 在 KaiwuDB 中的应用与实践

线上沙龙-技术流第 24 期营业啦01月12日&#xff08;周四&#xff09;19:30开务数据库 - B站直播间当数据库面对大量数据复杂 OLAP 查询时&#xff0c;性能出现局限性&#xff0c;无法满足用户 AP 方面的高性能要求。为此&#xff0c;KaiwuDB 推出了此项解决方案&#xff1a;借…

【NI Multisim 14.0原理图环境设置——电路图属性设置】

目录 序言 一、电路图属性设置 &#x1f34a;1.设置对象可见性 &#x1f34a;2.设置图纸颜色 &#x1f34a;3.设置图纸尺寸 &#x1f34a;4.设置图纸方向 &#x1f34a;5.设置图纸单位 &#x1f34a;6.设置图纸网格点 &#x1f34a;7.设置图纸边框 &#x1f34a;8. 设…

ELK安装使用

太久没用了&#xff0c;熟悉一下。 JDK1.8以上环境 下载地址 elasticsearch&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch kibana: https://www.elastic.co/cn/downloads/kibana logstash &#xff1a; https://www.elastic.co/cn/downloads/logstash…

社招前端二面必会手写面试题总结

字符串查找 请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中&#xff0c;并返回第一次出现的位置&#xff08;找不到返回 -1&#xff09;。 a34;b1234567; // 返回 2 a35;b1234567; // 返回 -1 a355;b12354355; // 返回 5 isContain(a,b);function isContain(a,…

RS—|下载Landsat8/9数据并进行ENVI大气校正(FLAASH模型)

文章目录1、 数据的下载。2、 辐射定标3、大气校正1、 数据的下载。 下载网址&#xff1a;链接: GloVis (usgs.gov)。下载的数据为2022年8月1日湖南省北部的遥感影像数据。该数据为L1级产品&#xff0c;只经过了几何校正&#xff0c;没有经过辐射定标和大气校正。 图1-1.下载…

富而喜悦2023直播盛典 唐苓馨主题演说“特别的礼物”!

网讯2023年1月1日19:30&#xff0c;富而喜悦一年一渡“特别的礼物”新年主题直播盛典晚会如约而至。富而喜悦品牌创始人唐苓馨女士&#xff0c;用自己与身边人的真实故事&#xff0c;为您讲述了“遇见生活中特别的礼物”。以下是富而喜悦品牌创始人唐苓馨女士在2023富而喜悦一年…

手写RPC框架05-通过SPI机制增加框架的扩展性的设计与实现

源码地址&#xff1a;https://github.com/lhj502819/IRpc/tree/v6 系列文章&#xff1a; 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现 现有的问题 在上一章节末尾我们提到了&#xff0c;目前我们的RPC框架可扩展性…

发表计算机SCI论文需要注意什么? - 易智编译EaseEditing

一篇SCI&#xff0c;除了能让审稿人浅显易懂的了解你的表达之外&#xff0c;我们还需要在内容上做好&#xff1a; 1、SCI论文标题创新、简洁 创新是因为写科技文章的目的在于报道新的科技进展&#xff0c;缺乏创新因素就会失去发表的意义。 但运用创新要建立在已有的科研成果…

QT部件透明阴影效果与不规则窗体

透明效果原始效果设置整个窗体透明&#xff0c;调用setWindowOpacity( )方法&#xff0c;传入一个0~1之间的值来表示透明度&#xff1b;1表示不透明&#xff0c;0表示完全透明setWindowOpacity(0.5);//0~1之间设置窗体透明&#xff0c;部件不透明setWindowFlags(Qt::FramelessW…

MATLAB | 赠书 | 如何从热图中提取数据

gzh上这篇文章正在抽奖赠书&#xff1a;截止日期2023年1月9日12&#xff1a;00&#xff08;周一&#xff09; MATLAB | 文末赠书 | 如何从热图中提取数据 赠送3本由北京大小出版社提供的《SPSS统计分析大全》 这期做了个可能有用的小工具&#xff0c;一般论文中热图很少给出…

十.指针进阶(对指针的深度理解)

目录 一. 字符指针 1.字符指针的定义 2.字符指针的用法 3.字符指针练习 二. 数组指针 1.指针数组的定义 2.指针数组的用法 三. 指针数组 1.数组指针的定义 2.数组名和&数组名的区别 3.数组指针的用法 4.练习 四. 数组传参和指针传参 1.一维数组传参 2.二维数…

十、MyBatisX插件

文章目录十、MyBatisX插件1 安装MyBatisX插件2 MybatisX代码速成3 在mapper接口中实现自定义功能【尚硅谷】MyBatisPlus教程-讲师&#xff1a;杨博超 失败&#xff0c;是正因你在距成功一步之遥的时候停住了脚步。 十、MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和ser…

Jdbc配置文件连接mysql8.0——通过拼接字符串进行批量增删改操作

目录 一、基类BaseDao 二、对dog表的批量增删改操作 (一)Dog类 (二)DogDao接口 (三)DogDaoImpl实现类 1.批量新增 2.批量删除 3.批量修改 (四)Test测试 1.新增 2.删除 3.修改 三、对master表进行批量增删改 (一)Master类 (二)MasterDao接口 (三)MasterDaoImpl实…

RK3588平台开发系列讲解(内核调试篇)oops分析

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、oops简介二、oops分析2.1、实验代码2.2、oops信息2.3、oops分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢当系统内核发生kernel panic的时候,系统会打印出oops信息,本篇主要介绍如何根据oops定位问…

2022/1/6总结

今天学习了KMP算法。 KMP算法 这是一个字符串查找的算法&#xff0c;我们之前学习的字符串查找都是暴力穷举&#xff0c;然而这个效率太低&#xff0c;于是有三位大佬发明了线性的KMP算法。 算法说难不难&#xff0c;说简单也不简单。 算法的核心思想是找到最长的相等的前…

Struts2框架之Action配置

Struts2框架之Action配置Action配置1、访问Action的三种方式1.1、method属性访问1.2、Action动态方法调用1.3、通配符调用2、配置默认的ActionAction配置 Action控制器在Struts2框架中至关重要&#xff0c;主要作用如下&#xff1a; 封装工作单元数据转移的场所返回结果字符串…

(黑马C++)L07 多态

一、多态的基本概念 多态是面向对象程序设计语言中除数据抽象和继承之外的第三个基本特征。 多态&#xff1a;父类的引用或者指针指向子类对象 C支持编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;运算符重载和函数重…

纷享销客CRM让科顺营销人更容易呼唤到“炮火”

希望让听得见“炮声”的人&#xff0c;更容易呼唤到“炮火”。对于在一线做营销的人而言&#xff0c;他们就是听到“炮声”的人。让一线的人员听得到“炮声”也就是销售线索、商机&#xff0c;能呼唤到“炮火”也就是呼唤到他们需要的资源。这恐怕是所有营销人都希望达到的境界…