vue upload 下载

目录 

上传

下载

get

post

对象/文件流

download处理返回

文件流

axios.post

封装axios

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

1.请求设置类型responseType: 'blob'(如果没有设置,打开文件会是乱码)

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

3.download

4.请求下载

相关基础

get和post请求

Response.text()以Promise对象获取响应的文本数据

decodeURIComponent() 解码

escape() 编码

blob

MIME


上传

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: '附件上传成功!'});}})}

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

下载

get

//静态a标签
<a :href='"/user/downloadExcel"' >下载模板</a>//动态创建a标签:
<div name="downloadfile" onclick="downloadExcel()">下载</div>
function downloadExcel() {let a = document.createElement('a')a.href ="/user/downloadExcel"a.click();
} //windowfunction downloadExcel() {window.location.href = "/tUserHyRights/downloadUsersUrl";
} 

post

对象/文件流

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

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

1.请求设置类型responseType: 'blob'(如果没有设置,打开文件会是乱码)

import request from '@/utils/request'
const baseUrl = process.env.NODE_ENV === 'development' ? '/test' : ''
const mock = falseexport 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 =decodeURIComponent(escape(res?.headers?.["content-disposition"]?.split("filename=")?.[1]))aLink.href = url;document.body.appendChild(aLink);aLink.click();document.body.removeChild(aLink);
}

4.请求下载

toDownloadTemplate() {console.log('下载模板')API.postQuery(`downloadTemplate/${this.fileId}`).then((res: any) => {if (res.data.type==="application/vnd.ms-excel") {download(res);} else {res.data.text().then((res: any) => {this.$message.warning(JSON.parse(res).msg)})}})}

相关基础

get和post请求

POST:用于传输信息给服务器,功能与 GET 类似,但一般推荐使用 POST 方式;

GET: 用于请求访问已经被 URI(统一资源标识符)识别的资源,可以通过 URL 传参给服务器;

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

因为GET参数通过URL传递,POST放在Request body
所以GET参数暴露在地址栏不安全,POST放在报文内部更安全

所以超链接下载get请求

Response.text()以Promise对象获取响应的文本数据

适用于requst指定responseType后,但响应的content-type有的不适合该responseType

fetch('https://example.com/api/data').then(response => response.text()).then(textData => {console.log(textData); // 输出响应的文本数据}).catch(error => {console.error(error);});

decodeURIComponent() 解码

函数对编码后的字符串进行解码,显示正常内容

escape() 编码

函数对乱码字符串进行编码,以确保特殊字符(如中文)按照 UTF-8 进行编码。

blob

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

MIME

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

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

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

"text"表示文本类型,

"image"表示图像类型等。

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

"plain"表示纯文本,

"vnd"表示自定义类型

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙技术|低功耗蓝牙和LE Audio助力游戏设备行业发展

去年&#xff0c;蓝牙技术联盟官方宣布推出LE Audio&#xff0c;它以BLE为基础&#xff0c;旨在更好地兼顾音频质量和低功耗&#xff0c;以在多种潜在应用中显著增强用户体验。这在游戏行业中引起了轰动&#xff0c;由于其延迟显著降低&#xff0c;LE Audio在增强游戏体验方面展…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 14 日论文合集)

文章目录 一、检测相关(6篇)1.1 LVLane: Deep Learning for Lane Detection and Classification in Challenging Conditions1.2 Garbage in, garbage out: Zero-shot detection of crime using Large Language Models1.3 Robotic surface exploration with vision and tactile …

asp.net core框架搭建1-搭建webapi,对数据增删改查接口模板(附源码)

文章目录 系列文章1.项目搭建1.1 新建Asp.net core webapi项目1.2 配置连接Mysql1.3 实现对mysql数据库的数据增删改查&#xff0c;接口1.3.1 根据id查询数据1.3.2 根据用户名模糊查询数据&#xff0c;并分页1.3.3 新增用户数据1.3.4 修改用户数据1.3.5 根据ID删除数据1.3.6 接…

【5G PHY】5G 调制与编码策略(MCS)介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Redis对象结构 — RedisObject

目录 Redis 键值对数据库的全过程​编辑 RedisObject结构体 Redis的encoding编码方式 type对应的数据对象类型 Redis 键值对数据库的全过程 redisDb 结构&#xff0c;表示 Redis 数据库的结构&#xff0c;结构体里存放了指向了 dict 结构的指针&#xff1b;dict 结构&#…

Day_63-65 集成学习之 AdaBoosting

目录 Day_63-65 一. 基本概念介绍 1. 集成学习 2. 弱分类器与强分类器 二. AdaBoosting算法 1. AdaBoosting算法框架介绍 2. AdaBoosting算法过程 三. 代码的实现过程 1. WeightedInstances类 2. 构造弱分类器的StumpClassifier类和抽象类SimpleClassifier 3. 主类Booster的…

Unity 之 超级详细的隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题 一&#xff0c;平台测试隐私问题二&#xff0c;解决方式一2.1 勾选自定义Mainifest2.2 修改自定义Mainifest2.3 隐私协议弹窗逻辑 三&#xff0c;解决方式二3.1 导出安卓工程3.2 创建上层Activity3.3 配置AndroidManifest 四&#xff0…

小红书Java后端一面,被问麻了

今天分享一篇小红书 2 年社招 Java 后端一面的面经&#xff0c;面试的风格是从一个知识一层一层深入问到底层。 从 Java IO&#xff0c;问到 socket 底层。从 Java 内存&#xff0c;问到操作系统内存。所以学习知识的时候&#xff0c;不要只看八股文&#xff0c;还是需要从点到…

集群基础3——haproxy负载均衡apache

文章目录 一、环境说明二、安装配置httpd三、安装配置haproxy四、验证http负载均衡五、配置https负载均衡六、haproxy网页监控6.1 监控参数详解6.2 页面操作 一、环境说明 使用haproxy对apache进行负载均衡。 主机IP角色安装服务192.168.161.131后端服务器1httpd,80端口192.168…

Vue计算属性:简化数据处理和视图更新的利器

一、计算属性的基本使用 计算属性&#xff1a;一个特殊属性&#xff0c;值依赖于另外一些数据动态计算出来。&#x1f6a9;&#x1f6a9;&#x1f6a9;计算属性特点&#xff1a;函数内使用的变量改变&#xff0c;重新计算结果返回。&#x1f4a3;&#x1f4a3;&#x1f4a3;注…

springcache的使用(小白也看得懂)

简介 SpringCache整合Redis可以使用Spring提供的Cacheable注解来实现对Redis的缓存操作。使用这种方式可以轻松地在应用程序中启用缓存&#xff0c;并且不需要手动编写访问Redis的代码。在配置文件中需要配置Redis的连接信息以及缓存管理器。使用这种方式可以做到轻松配置&…

满汉楼项目

满汉楼项目 1. 满汉楼介绍 满汉楼是一个综合餐饮管理系统&#xff0c;其主要分为&#xff1a; 人事登记&#xff1a;各部门人员信息登录管理&#xff1a;员工号、姓名、职位、密码菜谱价格&#xff1a;菜谱及价格报表统计&#xff1a;统计销售额成本及库房&#xff1a;名称注…