vue upload 上传下载

news2024/10/7 20:29:29

目录

上传

下载

对象/文件流

download处理返回

文件流

axios.post

封装axios

1.请求设置类型responseType: 'blob'

2.若有请求拦截(直接返回即可)

3.download

4.请求下载

相关基础

blob

MIME


vue 实现文件上传、下载的方法 - 掘金

上传

submitAddFile(){
            var formData = new FormData();
            formData.append('num', this.addType);
            formData.append('linkId',this.addId);
            formData.append('rfilename',this.addFileName);
            for(var i=0;i<this.addArr.length;i++){
                formData.append('fileUpload',this.addArr[i]);
            }
          let config = {
            headers: {
              'Content-Type': 'multipart/form-data',
              'Authorization': this.token
            }
          };
          this.axios.post(apidate.uploadEnclosure,formData,config)
            .then((response) => {
                if(response.data.info=="success"){this.$message({
                        type: 'success',
                        message: '附件上传成功!'
                    });
                }
            })
        }

下载

对象/文件流

download处理返回

export const download= (response: { data?: any; config?: any }) => {
  console.log("response", response);
return new Promise((resolve, reject) => {
  const fileReader = new FileReader();
  fileReader.onload = function () {
    try {
      console.log("result:", this.result);
      const jsonData = JSON.parse((this as any).result); // 成功 说明是普通对象数据
      if (jsonData?.code !== 200) {
        errorMsgTips(jsonData?.message ?? "请求失败");
        reject(jsonData);
      }
    } catch (err) {
      // 解析成对象失败,说明是正常的文件流
      // responseType为blob,以便接收二进制数据。
      const blob = new Blob([response.data]);
      // 本地保存文件
      const url = window.URL.createObjectURL(blob);
      const link = document.createElement("a");
      link.href = url;
      const filename = response?.config.headers?.["content-disposition"]
        ?.split("filename*=")?.[1]
        ?.substr(7);
      link.setAttribute("download", decodeURI(filename));
      document.body.appendChild(link);
      link.click();
      resolve(response.data);
    }
  };
  fileReader.readAsText(response.data);
});

文件流

axios.post

// Vue组件中的方法
methods: {
  downloadFile() {
    axios.post('/api/download', { /* 请求参数 */ }, { responseType: 'blob' })
      .then(response => {
        const url = window.URL.createObjectURL(new Blob([response.data]));
        const link = document.createElement('a');
        link.style.display = 'none'
        link.href = url;
         const filename = response?.config.headers?.["content-disposition"]
           ?.split("filename*=")?.[1]
           ?.substr(7);
         link.setAttribute("download", decodeURI(filename));// 指定下载后的文件名,防跳转
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
      })
      .catch(error => {
        // 处理错误
        console.error(error);
      });
  }
}

从响应头中提取文件名:响应头的Content-Disposition字段的值具有形式类似于filename*=UTF-8''example-file.txt,并提取出文件名example-file.txt

封装axios

vue 下载文件  后端直接返回文件流,打开下载文件是 [object Object],将res改成res.data即可

1.请求设置类型responseType: 'blob'

import request from '@/utils/request'
const baseUrl = process.env.NODE_ENV === 'development' ? '/test' : ''
const mock = false

export const postQuery = (params:string) => {
  const url = mock ? `${baseUrl}/xxx:8081/otherIndexUpload/${params}`: `${baseUrl}/otherIndexUpload/${params}`
  console.log('post: ',url)
  return request({url,method:'post', responseType: 'blob'})
}

return request({
    url: '/data/wos/download',
    method: 'post',
    data,
    responseType: 'blob',
    timeout: 3000000,
    onDownloadProgress: function (progressEvent: any) {
      // 处理原生进度事件
      store.state.percent = ((progressEvent.loaded / progressEvent.total) * 100).toFixed(2)
      console.log(`下载进度:${store.state.percent}`)
      if (Number(store.state.percent) == 100) {
        store.commit('changeProgress')
      }
    }
  })​

2.若有请求拦截(直接返回即可)

import service from 'axios'

// 响应拦截器
service.interceptors.response.use(
  (response: { data: any; config: any }) => {
    const resData = response.data || {}
    if (response.config.responseType === 'blob') {
      return response
    }..
  },
  (error: any) => {
...
  }
)

export default service

3.download

export const download = (res: any) => {
  var blob = new Blob([res.data], {
    type: "application/vnd.ms-excel;charset=utf-8",
  });
  var url = window.URL.createObjectURL(blob);
  var aLink = document.createElement("a");
  aLink.style.display = "none";
  aLink.download = "其他数据指标模版.xls";
  aLink.href = url;
  document.body.appendChild(aLink);
  aLink.click();
  document.body.removeChild(aLink);
}

4.请求下载

toDownloadTemplate() {
    console.log('下载模板')
    API.postQuery(`downloadTemplate/${this.wpReleId}`).then((res: any) => {
      if (res.data.type === "application/json") {
        this.$message.warning("指标配置内容为空")
      } else {
        download(res);
      }
    })
  }

相关基础

blob

二进制大对象(Binary Large Object)。Blob是存储二进制数据的数据类型,例如图像、音频和视频文件等

MIME

多用途互联网邮件扩展(Multipurpose Internet Mail Extensions)表示传输的文件性质和格式。在HTTP头部或其他协议中指定一个特定的字符串,来标识文件的类型。

主类型表示文件的大类别,

"application"表示应用程序类型,

"text"表示文本类型,

"image"表示图像类型等。

子类型表示具体的文件格式,

"plain"表示纯文本,

"vnd"表示自定义类型

"vnd.ms-excel":Microsoft Excel电子表格文件。

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

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

相关文章

基础算法-【离散化】

离散化的本质&#xff1a;是建立了一段数列到自然数之间的映射关系&#xff08;value -> index)&#xff0c;通过建立新索引&#xff0c;来缩小目标区间&#xff0c;使得可以进行一系列连续数组可以进行的操作比如二分&#xff0c;前缀和等… 相应的算法模板&#xff1a; v…

【Linux】—— 进程地址空间

序言&#xff1a; 在上篇中&#xff0c;我们讲解了关于进程优先级的概念。本期&#xff0c;我将给大家介绍的是关于进程地址空间的话题。 目录 &#xff08;一&#xff09;程序地址空间回顾 &#xff08;二&#xff09;代码演示 &#xff08;三&#xff09;进程地址空间的引…

【力扣算法08】之 5. 最长回文子串 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析 运行效果截图调用示例运行结果 完结 问题描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例1 输入&#xff1a;s…

【网络编程】Linux服务器程序规范相关内容

文章目录 1、日志1.1、syslog()函数 2、用户信息2.1、UID、EUID、GID、EGID 3、进程间关系3.1、进程组3.2、会话 4、服务器程序后台化&#xff08;守护进程&#xff09; 1、日志 Linux提供一个守护进程rsyslogd来处理系统日志&#xff0c;系统日志中包括用户进程产生的日志以及…

VUE2基础-Vue实例

Vue 实例 创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的&#xff1a; var vm new Vue({// 选项 }) 虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名…

交换:交换机相关技术(二层技术)

目录 VLAN&#xff1a;虚拟局域网 VLAN种类&#xff1a; 接口分配链路类型 接口划分VLAN 跨网段的通讯 VLAN&#xff1a;虚拟局域网 LAN &#xff1a;局域网 MAN&#xff1a;城域网 WAN&#xff1a;广域网 1.一个VLAN相当于一个广播域 VLAN&#xff1a;通过路由器和交换机…

PADS Logic如何对原理图页面进行操作呢?

在绘制复杂的原理图时&#xff0c;会根据功能模块来将原理图进行分页处理&#xff0c;在绘制原理图过程中&#xff0c;会对原理图页面进行一些处理&#xff0c;操作方法如下所列&#xff1a; 1、页面拷贝与粘贴&#xff1a;在原理图中选中需要复制的元件走线等&#xff0c;左击…

Git常用命令及在Idea中如何使用创建分支等,详讲带图[保姆级]

文章目录 Git在Git命令行中执行下面命令:设置基本信息获取Git仓库Git 工作区 暂存区 版本库概念工作状态远程仓库操作分支操作标签分类 Idea中使用推送到远程仓库(提交并且推送)分支操作 Git 在Git命令行中执行下面命令: 设置基本信息 设置用户信息 git config --global use…

阿里巴巴开源的Spring Cloud Alibaba手册在GitHub上火了,完整版开放下载

“微服务架构经验你有吗&#xff1f;” 前段时间一个朋友去面试&#xff0c;阿里面试官一句话问倒了他。实际上&#xff0c;不在BAT这样的大厂工作&#xff0c;是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得&#xff0c;让各个大厂都抢着要这样的人才&#x…

Bash 第十行

195 第十行 给定一个文本文件 file.txt&#xff0c;请只打印这个文件中的第十行。 示例: 假设 file.txt 有如下内容&#xff1a; Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 你的脚本应当显示第十行&#xff1a; Line 10 来源&#xff1a;…

NITIRE 2023官方的PSNR及SSIM计算代码

NITIRE 2023官方的PSNR及SSIM计算代码 问题描述 做图像复原任务时&#xff0c;总避免不了计算PSNR和SSIM等图像质量评估指标&#xff0c;但是网上实在是太多计算这类指标的代码了&#xff0c;不同代码计算的结果还可能存在差异。有使用matlab计算SSIM的&#xff0c;也有使用py…

7月23作业

2.作业 platform驱动实现 platform.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/device.h> #include <linux/cdev.h> #include <linux/slab.h> #include <linux/io.h> #include&l…

CDN技术(Content Delivery Network,内容分发网络)分布式网络架构(CND与P2P(Peer-to-Peer)区别)

文章目录 CDN是什么&#xff1f;CDN的优势CDN的应用1. 静态内容加速2. 动态内容加速3. 视频流媒体4. 软件分发5. 游戏加速6. 移动应用加速 CDN收费吗&#xff1f;CND与P2P区别什么是静态内容和动态内容&#xff1f; CDN是什么&#xff1f; CDN&#xff08;Content Delivery Ne…

七大排序算法——直接选择排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、直接选择排序核心思想代码实现 三、性能分析四、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递…

基于linux下的高并发服务器开发(第一章)- Makefile(1)1.10

01 / 什么是Makefile 02 / Makefile文件命名和规则 &#xff08;1&#xff09;在~/Linux/lesson7目录下,vim Makefile &#xff08;2&#xff09;ll查看当前目录下的文件信息 &#xff08;3&#xff09;编辑以下内容,然后保存并退出 app:sub.c add.c mult.c div.c main.c gcc…

熊猫代阅脚本-沉睡者IT技术分享

熊猫代阅脚本-我的编程技术之路 熊猫阅读app是一款酷炫的阅读应用带来了多样化的阅读模式&#xff0c;熊猫阅读app专注网络小说阅读&#xff0c;更新快&#xff0c;让大家获得最好的小说阅读体验&#xff0c;有需要的快来下载。 熊猫阅读app亮点 阅读赚钱&#xff1a;越读越…

DAY46:动态规划(七)01背包应用:分割等和子集+最后一块石头重量Ⅱ+目标和

文章目录 416.分割等和子集&#xff08;回溯01背包&#xff09;思路回溯解法&#xff08;类似组合总和Ⅱ&#xff09;回溯解法存在的问题 01背包思路为什么能抽象成背包问题 01背包写法1&#xff1a;常规写法&#xff0c;考虑重量价值重量价值类问题的思考方式DP数组含义递推公…

综合小实验

第一步&#xff1a;计划IP R1的环回&#xff1a;192.168.1.0/28 R2的环回&#xff1a;192.168.1.16/28 R123的O/O/0接口&#xff1a;192.168.1.32/28 R3-4&#xff1a;192.168.1.128/30 Vlan2&#xff1a;192.168.1.48/28 vlan3&#xff1a;192.168.1.64/28 192.168.1.0/24 0区…

力扣 279. 完全平方数

一、题目描述 给你一个整数 n&#xff0c;返回和为 n 的完全平方数的最少数量 。 完全平方数是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 …

3Ds max入门教程:创建马来西亚双子塔3D模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 最终图像&#xff1a; 步骤-1 下面给出了这个双子塔的基本轮廓。 步骤-2 由于它是一栋88层的建筑&#xff0c;所以我一开始打算把它建到40层。为此&#xff0c;我使用标准的基元类型&#xff1a;盒子和圆…