Vue3_上传文件_下载文件

news2024/11/19 1:52:12

目录

一、上传文件

二、下载文件


vue3对接后端进行文件上传和下载。

一、上传文件

点击上传资料按钮,选择文件,进行上传。

创建一个proFile.vue,文件,这个文件可以作为一个子组件在其他页面引用。

组件用的element-Plus的ElMessageBox, ElLoading,以及el-upload,el-button。

style 用的lang="less"。

 proFile.vue:

<template>
  <div class="profileContainer">
    <div class="upload">
      <div class="btnStyle">
        <div class="eduData">上传资料</div>
      </div>
      <el-upload
        class="upload-demo"
        action=""
        :http-request="handleUpload"
        :before-upload="beforeUpload"
        :on-change="
          (file, fileList) => {
            handleChanges(file, fileList);
          }
        "
        v-model="upload"
        :show-file-list="false"
        :on-preview="handlePreview"
      >
        <el-button size="default" type="primary" class="hidddenBtn">上传资料 </el-button>
      </el-upload>
    </div>
  </div>
</template>

<script setup>
import { reactive, toRefs, computed } from "vue";
import { ElMessageBox, ElLoading } from "element-plus";

const state = reactive({
  upload: [],
  loading: false,
});
const { upload, loading } = toRefs(state);

// 弹框
const message = (info) => {
  return ElMessageBox.confirm(`${info}`, {
    confirmButtonText: "确定",
    showCancelButton: false,
    type: "warning",
  }).then(
    () => true,
    () => false
  );
};

// 更改上传路径,覆盖默认的上传行为,可以自定义上传的实现
const handleUpload = (paramFile) => {
  let param = new FormData();
  param.append("file", paramFile.file);
  param.append("uid", paramFile.file.uid);
  uploadFile(param);
  return Promise.resolve();
};

const uploadFile = async (param) => {
  const loading = ElLoading.service({
    lock: true,
    text: "正在上传中,请耐心等待,谢谢!",
    background: "rgba(0, 0, 0, 0.5)",
  });

  //reqFileUpload,换成你自己的后端接口
  let result = await reqFileUpload(param);
  if (result.error_code == 0) {
    loading.close();
    //上传成功
  } else {
    loading.close();
    //上传失败
  }
};

// 上传前触发,判断文件是否符合大小要求,当前设定大小为50M
const beforeUpload = (file, fileList) => {
  const isLt2M = file.size / 1024 / 1024 < 50;
  // 文件大小限制
  if (!isLt2M) {
    ElMessageBox.confirm(`上传文件大小不能超过 500MB! 请重新上传~`, {
      confirmButtonText: "确定",
      showCancelButton: false,
      type: "warning",
    }).then(
      () => true,
      () => false
    );
    fileList.splice(-1, 1); //移除当前超出大小的文件
    return false;
  }
  return isLt2M;
};

// 文件改变触发
const handleChanges = (file, fileList) => {
  state.upload = fileList;
};
</script>

<style lang="less" scoped>
.profileContainer {
  position: relative;

  .upload {
    position: relative;
    border: none;

    .btnStyle {
      width: 76px;
      height: 36px;
      border-radius: 4px 4px 4px 4px;
      padding: 0 10px;
      text-align: center;
      font-size: 14px;
      color: #00b498;
      line-height: 36px;
      border: none;
      margin-right: 10px;

      .eduData {
        width: 76px;
        height: 34px;
        line-height: 34px;
        background: #d2ebff;
        font-size: 14px;
        color: #000;
        border: none;
        text-align: center;
        border-radius: 4px 4px 4px 4px;
      }
    }

    .hidddenBtn {
      position: absolute;
      left: 30px;
      top: 5px;
      width: 75px;
      opacity: 0;
    }
  }

  img {
    position: relative;
    top: 0;
    width: 14px;
    height: 14px;
  }

  .showFile {
    background-color: #a6e3c5;

    .fileName {
      display: inline-block;
      width: 140px;
      height: 22px;
      line-height: 22px;
      background-color: #fff;
      margin-right: 20px;
    }
  }
}

:deep(.upload-demo) {
  position: relative;
  top: -40px;
  left: -20px;
}

:deep(.el-upload-list) {
  width: 870px;
  overflow-y: auto;
  overflow-x: hidden;
  position: relative;
  top: 5px;
  left: 20px;
  max-height: 85px;
}

:deep(.el-upload-list__item) {
  float: left;
  width: 145px;
  height: 22px;
  line-height: 22px;
  background-color: #f8faf9;
  margin-right: 20px;
}

:deep(.el-progress) {
  opacity: 0;
}

:deep(.el-upload-list__item .el-icon--upload-success) {
  z-index: 1000;
  opacity: 1;
}
</style>

二、下载文件

从后端获取到Blob类型的文件,Blob(Binary Large Object)表示二进制类型的大对象,通常是影像、声音或多媒体文件。MySql/Oracle数据库中,就有一种Blob类型,专门存放二进制数据。在 JavaScript 中 Blob 对象表示一个不可变、原始数据的类文件对象,它不一定非得是大量数据,也可以表示一个小型文件的内容。


下载文件方法:

//从后端获取这个方法,调用这个方法下载文件,传入文件name。param是一个文件标志,获取当前文件内容
const downLoadFileSuccess = async (name, param) => {
  //reqDownloadFile从后端获取文件数据的接口,param是一个文件标志,获取当前文件内容
  let result = await reqDownloadFile(param);
  if (result != undefined) {
    //浏览器下载
    const myBlob = new window.Blob([result], { type: result.type });
    const qrUrl = window.URL.createObjectURL(myBlob);
    var fileLink = document.createElement("a");
    fileLink.href = qrUrl;
    fileLink.setAttribute("download", name);
    document.body.appendChild(fileLink);
    fileLink.click();
  } else {
    console.log(result.datas_info)
  }
};

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

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

相关文章

端午假期来临,来使用闪侠惠递便宜寄快递吧!

相信很多人和我一样&#xff0c;每当需要寄快递时&#xff0c;总是感到十分头疼。不同的快递公司有不同的价格、时效和服务质量等等&#xff0c;选择起来真的很不容易。但是现在有了闪侠惠递来帮大家寄快递吧&#xff0c;这个问题就可以迎刃而解了&#xff01;小编奉劝大家快来…

NSSCTF CRYPTO MISC题解(一)

陇剑杯 2021刷题记录_[陇剑杯 2021]签到-CSDN博客 [陇剑杯 2021]签到 下载附件压缩包&#xff0c;解压后得到 后缀为.pcpang&#xff0c;为流量包&#xff0c;流量分析&#xff0c;使用wireshark打开 {NSSCTF} [陇剑杯 2021]签到 详解-CSDN博客 选择统计里面的协议分级 发现流…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

接口的应用、 适配器设计模式

接口的应用 适配器设计模式 Inter package com.itheima.a09;public interface Inter {public abstract void show1();public abstract void show2();public abstract void show3();public abstract void show4();}InterAdapter package com.itheima.a09; //抽象 public abs…

WPF中读取Excel文件的内容

演示效果 实现方案 1.首先导入需要的Dll(这部分可能需要你自己搜一下) Epplus.dll Excel.dll ICSharpCode.SharpZipLib.dll 2.在你的解决方案的的依赖项->添加引用->浏览->选择1中的这几个Dll点击确定。(添加依赖) 3.然后看代码内容 附上源码 using Excel; usi…

苍穹外卖笔记-08-套餐管理-增加,删除,修改,查询和起售停售套餐

套餐管理 1 任务2 新增套餐2.1 需求分析和设计接口设计setmeal和setmeal_dish表设计 2.2 代码开发2.2.1 根据分类id查询菜品DishControllerDishServiceDishServiceImplDishMapperDishMapper.xml 2.2.2 新增套餐接口SetmealControllerSetmealServiceSetmealServiceImplSetmealMa…

阿里通义千问,彻底爆了!(本地部署+实测)

点击“终码一生”&#xff0c;关注&#xff0c;置顶公众号 每日技术干货&#xff0c;第一时间送达&#xff01; 问大家一个问题&#xff1a;你是否想过在自己的电脑上部署一套大模型&#xff1f;并用自己的知识库训练他&#xff1f; 阿里通义千问今天发布了最新的开源大模型系…

【转】ES, 广告索引

思考&#xff1a; 1&#xff09;直接把别名切换到上一个版本索引 --解决问题 2&#xff09;广告层级索引如何解决&#xff1f; -routing、join 3&#xff09;查询的过程&#xff1a;query and fetch, 优化掉fetch 4&#xff09;segment合并策略 5&#xff09;全量写入时副…

二轴机器人大米装箱机:技术创新引领智能包装新潮流

在科技日新月异的今天&#xff0c;自动化和智能化已成为各行各业追求高效、精准生产的关键。作为粮食加工行业的重要一环&#xff0c;大米装箱机的技术创新与应用价值日益凸显。其中&#xff0c;二轴机器人大米装箱机以其高效、稳定、智能的特点&#xff0c;成为市场的新宠。星…

IT学习笔记--Flink

概况&#xff1a; Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前&#xff0c;Flink 已经成为各大公司大数据实时处理的发力重点&#xff0c;特别是国内以阿里为代表的一众互联网大厂都在全力投入&#xff0c;为 Flink 社区贡献了大量源码。 Apache Flink 是一个…

SQL进阶day10————多表查询

目录 1嵌套子查询 1.1月均完成试卷数不小于3的用户爱作答的类别 1.2月均完成试卷数不小于3的用户爱作答的类别 ​编辑1.3 作答试卷得分大于过80的人的用户等级分布 2合并查询 2.1每个题目和每份试卷被作答的人数和次数 2.2分别满足两个活动的人 3连接查询 3.1满足条件…

嵌入式Linux系统编程 — 2.1 标准I/O库简介

目录 1 标准I/O库简介 1.1 标准I/O库简介 1.2 标准 I/O 和文件 I/O 的区别 2 FILE 指针 3 标准I/O库的主要函数简介 4 标准输入、标准输出和标准错误 4.1 标准输入、标准输出和标准错误概念 4.2 示例程序 5 打开文件fopen() 5.1 fopen()函数简介 5.2 新建文件的权限…

分享:各种原理测厚仪的发展历程!

板材厚度的检测离不开测厚仪的应用&#xff0c;目前激光测厚仪、射线测厚仪、超声波测厚仪等都已被广泛的应用于板材生产线中&#xff0c;那你了解他们各自的发展历程吗&#xff1f; 激光测厚仪的发展&#xff1a; 激光测厚仪是随着激光技术和CCD&#xff08;电荷耦合器件&…

如何挑选最适合你的渲染工具

随着技术的发展&#xff0c;云渲染平台逐渐成为设计师、动画师、影视制作人员等创意工作者的得力助手。然而&#xff0c;市场上的云渲染平台种类繁多&#xff0c;如何选择最适合自己的渲染工具成为了一个需要认真考虑的问题。 在挑选适合自己的云渲染工具时&#xff0c;我们需…

tomcat10部署踩坑记录-公网IP和服务器系统IP搞混

1. 服务器基本条件 使用的阿里云服务器&#xff0c;镜像系统是Ubuntu16.04java version “17.0.11” 2024-04-16 LTS装的是tomcat10.1.24阿里云服务器安全组放行了&#xff1a;8080端口 服务器防火墙关闭&#xff1a; 监听情况和下图一样&#xff1a; tomcat正常启动&#xff…

Vue2(0基础入门)

环境准备 安装脚手架 vuecli: npm install -g vue/clivite: npm init vuelatest-g 全局安装&#xff0c;任意目录都可以使用vue脚本 进入目录创建项目&#xff1a; 在目录的终端输入&#xff1a;vue ui安装devtool(这个网页是安装好了自动跳转的) 运行项目&#xff1a; …

MS1112驱动开发

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

Mysql基础进阶速成2

看着篇文章之前先看我的前一章&#xff1a;MySQL基础进阶速成1 函数&#xff1a; 每个字段使用一个函数&#xff1a;select 函数(字段名)from 表名 upper&#xff1a;将字符串中的字母大写 lower&#xff1a;将字符串中的字符小写 max&#xff1a;得到最大值 min&#xf…

力扣hot100:295. 数据流的中位数(两个优先队列维护中位数)

LeetCode&#xff1a;295. 数据流的中位数 这个题目最快的解法应该是维护中位数&#xff0c;每插入一个数都能快速得到一个中位数。 根据数据范围&#xff0c;我们应当实现一个 O ( n l o g n ) O(nlogn) O(nlogn)的算法。 1、超时—插入排序 使用数组存储&#xff0c;维持数…

pyqt5 tablewidget实现excel拖曳填充

代码主要涉及鼠标事件和绘图&#xff0c;selectionModel&#xff0c;selectedIndexes。 import sys from PyQt5.QtCore import QPoint, Qt, QCoreApplication, pyqtSlot from PyQt5.QtGui import QBrush, QPixmap, QColor, QPainter,QIcon,QPolygon from PyQt5.QtWidgets imp…