Vue3_上传文件_下载文件

目录

一、上传文件

二、下载文件


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)
  }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity游戏制作】地精寻宝Gnome‘s Well That Ends Well卷轴动作游戏【一】场景搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

2024北京消防展6.26召开-看消防安全企业如何升级赋能

2024北京消防展6.26召开-看消防安全企业如何升级赋能 随着社会的快速发展&#xff0c;消防安全已经成为企业安全生产的重要一环。作为消防领域的品质盛会&#xff0c;2024中国&#xff08;北京&#xff09;消防技术与设备展览会将于6月26-28 日在北京.首钢会展中心召开&#xf…

【代码随想录】【算法训练营】【第31天】 [455]分发饼干 [376]摆动序列 [53]最大子序和

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 31&#xff0c;放假前的周五&#xff0c;总是令人激动的~ 题目详情 [455] 分发饼干 题目描述 455 分发饼干 解题思路 前提&#xff1a; 思路&#xff1a;贪心算法&#xff0c;小饼干优先满…

揭秘!如何从精益生产转向智能制造

企业在“工业4.0、智能制造、互联网”等概念满天飞的环境下迷失了方向&#xff0c;不知该如何下手&#xff0c;盲目跟风。 君不见&#xff0c;很多企业在“工业4.0、智能制造、互联网”等概念满天飞的环境下迷失了方向&#xff0c;不知该如何下手&#xff0c;盲目跟风&#xf…

【TB作品】MSP430F5529 单片机,温度控制系统,DS18B20,使用MSP430实现的智能温度控制系统

作品功能 这个智能温度控制系统基于MSP430单片机设计&#xff0c;能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括&#xff1a; 实时显示当前温度。通过OLED屏幕显示温度报警值。通过按键设置温度报警值。实际温度超过报警值时&…

Linux网络编程——概念及实现双方聊天

网络编程的场景&#xff1a; 假设你面前有五座房子&#xff08;服务器&#xff09;&#xff0c;你要走到其中一座房子的某一间&#xff0c;此时你站在五座房子面前很迷茫&#xff0c;突然&#xff0c;第二座房子上面有人在叫&#xff0c;并且用汉语&#xff08;TCP/UDP&#xf…

seerfar丨OZON运营工具,OZON选品插件

随着全球电商市场的蓬勃发展&#xff0c;OZON作为俄罗斯及东欧地区的重要电商平台&#xff0c;吸引了众多中国商家的目光。然而&#xff0c;如何在OZON平台上脱颖而出&#xff0c;实现高效的商品运营&#xff0c;成为了众多商家亟待解决的问题。在这样的背景下&#xff0c;seer…

tailwindcss的@apply使用

tailwindcss的apply是把在html写的tailwindcss可以挪到style里面 简化页面的可读性 没写之前的 <section class"block-risk absolute flex flex-col items-center p-4 text-center left-0 text-white;" :style"{ top, left: 60px }"> </section…

【Week-R2】使用LSTM实现火灾预测(tf版本)

【Week-R2】使用LSTM实现火灾预测&#xff08;tf版本&#xff09; 一、 前期准备1.1 设置GPU1.2 导入数据1.3 数据可视化 二、数据预处理(构建数据集)2.1 设置x、y2.2 归一化2.3 划分数据集 三、模型创建、编译、训练、得到训练结果3.1 构建模型3.2 编译模型3.3 训练模型3.4 模…

移动安全赋能化工能源行业智慧转型

随着我国能源化工企业的不断发展&#xff0c;化工厂中经常存在火灾爆炸的危险&#xff0c;特别是生产场所&#xff0c;约有80%以上生产场所区域存在爆炸性物质。而目前我国化工危险场所移动通信设备的普及率高&#xff0c;但是对移动通信设备的安全防护却有所忽视&#xff0c;包…

国自然基金的检索

&#xff08;1&#xff09;网址 跳转国自然基金网址&#xff1a;https://www.nsfc.gov.cn/ &#xff08;2&#xff09;查询入口 &#xff08;3&#xff09;进行查询

antdv 穿梭框

antd的穿梭框的数据貌似只接收key和title&#xff0c;而且必须是字符串&#xff08;我测试不是字符串的不行&#xff09;&#xff0c; 所以要把后端返回的数据再处理一下得到我们想要的数据 除了实现简单的穿梭框功能&#xff0c;还想要重写搜索事件&#xff0c;想达到的效果是…

【96】write combine机制介绍

前言 这篇文章主要介绍了write combine的机制 一、write combine的试验 1.系统配置 &#xff08;1&#xff09;、CPU&#xff1a;11th Gen Intel(R) Core(TM) i7-11700 2.50GHz &#xff08;2&#xff09;、GPU&#xff1a;XX &#xff08;3&#xff09;、link status&am…

Towards Graph Contrastive Learning: A Survey and Beyond

目录 Towards Graph Contrastive Learning- A Survey and Beyond摘要IntroductionPRELIMINARY符号说明GNN对比学习下游任务 GCL自监督学习增强策略基于规则随机扰动或mask子图采样图扩散 基于学习图结构学习图对抗训练图合理化 对比模式同尺度对比全局上下文局部 跨尺度对比局部…

构建体育直播平台源码:深度解析数据分析模块的核心展示内容

在现代的体育直播平台中&#xff0c;数据分析展示已经成为不可或缺的一部分。如下参考借助“东莞梦幻网络科技”提供的体育直播源码&#xff0c;打造的平台&#xff0c;并通过表格形式为用户列出以下数据分析内容&#xff1a; 1、积分排名&#xff1a;反映了各支队伍在赛季中的…

HIK录像机GB28181对接相机不在线问题随笔

一、问题现象 【设备信息】型号&#xff1a;DS-8664N-I16-V3 V4.63.000 build 230412 【问题现象】HIK录像机使用GB28181对接异常相机无法正常上线&#xff0c;对接HIK相机可以正常上线。 【现场拓扑】现场拓扑如下 NVR侧使用固定公网IP地址。IPC侧使用家用宽带的方式&…

玩转ChatGPT:最全学术论文提示词分享【上】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在当今数字时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正迅速改变各行各业的运作方式。特别是&#xff0c;OpenAI的ChatGPT等语言模型以其强大的文本生成能力&#xff0c;…

从零开始实现自己的串口调试助手(8)-循环发送

循环发送 准备 创建槽函数 设置QSpinBox的最大值 注意&#xff1a; // 我们不能在qt的ui线程中延时&#xff0c;否则将导致页面刷新问题 //QThread::msleep(ui->spinBox->text().toInt());//设置下次发送时间间隔 定时器实现 关联信号与槽: //添加自动换行定…

C++学习/复习13--list概述

一、list概念 1.带头双向链表 2.构造函数 3.迭代器&#xff08;其迭代器需尤其注意&#xff09; 4、size 5.front/back 6.插入删除 删除时的迭代器失效 由于list的节点特殊&#xff0c;既有数据又有指针&#xff0c;其实现需要节点/迭代器/list各成一类再组合

UI框架与MVC模式详解(1)——逻辑与数据分离

【效率最高的耦合方式】 以实际的例子来说明&#xff0c;更容易理解些。 这里从上到下&#xff0c;从左到右共有8个显示项&#xff0c;如果只需要显示这8个&#xff0c;不会做任何改变&#xff0c;数据固定&#xff0c;那么我们只需要最常规的思路去写就好&#xff0c;这是最…