首页 > 其他分享 >下端下载文件几种方式

下端下载文件几种方式

时间:2023-05-06 20:58:59浏览次数:45  
标签:const url 下端 几种 application blob data response 下载

一、a标签download下载
后端返回一个可下载的url文件,或者前端本地保存的文件,通过路径引入下载。
(1)将资源放入前端本地保存,打包后随一起上传自服务器


// 本地资源下载,引入路径即可,这里的路径指的是打包后文件与代码文件的相对路径
<a href="./import-template.xlsx" download target="_blank">
下载上传模板
</a>
(2)请求服务器,返回的url放入a标签的href属性中,
下面是伪代码,实现的步骤 先获取url,将其作为变量,放入a标签的href属性中,不同的框架方法不同。

let requestUrl = 'xxxxxx';
let responseUrl = '';
fetch(requestUrl ).then(res => {
responseUrl = res.data.url
})

// dom节点渲染如果responseUrl出现跨域,download将失效,无法下载
<a href=`${responseUrl }` download target="_blank">
下载上传模板
</a>

(3) 不依赖框架,原生js实现点击下载的方式

//点击某个按钮触发事件
const onClickDownFile = (id) => {
let requestUrl = `xxxxxx${id}xxxx`;
fetch(requestUrl).then(res => {
//为了解决a标签跨域无法下载的问题
const x = new XMLHttpRequest();
x.open('GET', res.data.url, true);
x.responseType = 'blob';
x.onload = () => {
const dataurl = window.URL.createObjectURL(x.response);
const a = document.createElement('a');
a.href = res.data.url;
a.download = res.data.url;
a.click();
a.remove();
};
x.send();
})
};

二、后端接口返回二进制流,前端需要接收处理

import { stringify } from 'qs';

type Method = 'GET' | 'POST';

/**
* 下载文件
* @param url 接口路径
* @param data 请求的参数
* @param method 请求方式
* @param type 下载文件的类型
* @param fileName 自定义文件名称
*/
export const download = (
url: string,
data: any,
method: Method,
type: string,
fileName?: string,
) => {
/** fetch 配置项 */
const params: RequestInit = {
method,
headers: {
Authorization: '',
'response-type': 'arraybuffer',
},
};

if (method === 'GET') {
// 每次请求添加时间戳,避免 GET 请求遭遇 HTTP 缓存
data._ = new Date().getTime();

// 请求参数合并到 URL 上
url += `?${stringify(data)}`;
} else {
params.body = JSON.stringify(data);
}

return fetch(url, params)
.then((response) => {
if (response.status === 200 && response.body) {
if (!fileName) {
const cd = response.headers.get('content-disposition');
const cds = cd?.split('filename=') || [];
if (cds[1]) {
fileName = decodeURIComponent(cds[1]);
}
}
return response.blob();
}

return Promise.reject();
})
.then((_blob) => {
const blob = new Blob([_blob], {
type,
});
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = fileName || 'file';
link.click();

return 'done';
});
};

使用方式

download(
'xxxx',
{},
"GET", //或者"POST"
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
fileName, //文件名称
)
1
2
3
4
5
6
7
type是文件类型,不同的文件类型type不同

后缀 MIME Type
.doc application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.xls application/vnd.ms-excel
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.ppt application/vnd.ms-powerpoint
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
三、后端视情况返回二进制流文件。
我在一个项目中遇到这样一个需求,前端导入文件,后端解析并返回结果,如果成功,返回的data为null,code为0,如果失败,返回一个excel的二进制流文件,在excel文件中显示的是失败的原因,并自动下载文件。


const downloadBlob = (blob: Blob, type: string, fileName?: string) => {
const newBlob = new Blob([blob], {
type,
});
const link = document.createElement('a');
link.href = window.URL.createObjectURL(newBlob);
link.download = fileName || '错误文件';
link.click();
};

export const FileUpload = (url: string, file: FormData): Promise => {
/** fetch 配置项 */
const params: RequestInit = {
method: 'POST',
headers: {
Authorization: '',
},
body: file,
};

return fetch(url, params).then((response) => {
if (response.status === 200 && response.body) {
return new Promise((resolve, reject) => {
const contentType = response.headers.get('content-type') || '';

if (contentType.indexOf('application/json') >= 0) {
// 返回的是 JSON 文件
response.json().then(resolve);
} else if (contentType.indexOf('application/vnd.ms-excel') >= 0) {
// 返回的是 excel 文件
response.blob().then((_blob) => {
const cd = response.headers.get('content-disposition');
const cds = cd?.split('filename=') || [];

downloadBlob(
_blob,
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
decodeURIComponent(cds[1]),
);

resolve();
});
} else {
reject();
}
});
}

return Promise.reject();
});
};
————————————————
版权声明:本文为CSDN博主「可缺不可滥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/glorydx/article/details/110226086

标签:const,url,下端,几种,application,blob,data,response,下载
From: https://www.cnblogs.com/shuihanxiao/p/17378423.html

相关文章

  • 手机通话记录生成器在线,通话记录生成器下载,通话记录生成器安卓版
    在了解通话记录生成器app的时候,铁牛通话记录生成器,就是进jp155.com,它是一个为用户一键自动生成通话记录的app。怎么下?这段话的这几个网,复制任意一个网址到你的手机浏览器去打开它。通话记录生成器软件app,通话记录生成器安卓版jp1988.com,通话记录生成器app,通话记录生成器在线,通话记......
  • 通话记录生成器app软件下载,通话记录生成器最新版,电销通话记录生成器
    铁牛通话记录生成器haosen111.com是可以一键自动批量生成通话记录app。铁牛通话记录生成器,复制这些字母串到手机浏览器去打开,可以进来jp155.com,默认跟着软件上设置好的五步,从上往下顺着操作。“铁牛通话记录生成器下载”?在这里也可以jp1988.com铁牛通话记录生成器,前面的这些网都可......
  • 手机通话记录生成器下载,虚拟通话记录生成器,通话记录生成器安卓版下载最新版本
    铁牛通话记录生成器是一键批量虚拟生成通话记录的app,“铁牛通话记录生成器下载”?这段话里面几个网都可以,复制它们到手机浏览器打开就可以,在铁牛通话记录生成器wokaituan.com上,你可以批量把号码复制粘贴进来软件app上,可以选择通话时间范围,设置通话时间长度,选择通话类型(呼出电话、呼......
  • yum 下载全量依赖 rpm 包及离线安装
    yum下载全量依赖rpm包及离线安装简介通常生产环境由于安全原因都无法访问互联网。此时就需要进行离线安装,主要有两种方式:源码编译、rpm包安装。源码编译耗费时间长且缺乏编译环境,所以一般都选择使用离线rpm包安装。验证环境Centos7.8查看依赖包可以使用“yumdeplist......
  • 通话记录生成器安卓版下载,手机通话记录生成器app,一键批量生成通话记录
    铁牛通话记录生成器是可以批量自动生成通话记录的app软件。如何“铁牛通话记录生成器下载”?这段话的这几个网都可以,复制它们到手机浏览器打开就可以。通话记录生成器下载jp155.com,通话记录生成器安卓版下载jp1988.com,下载通话记录生成器app,体验通话记录生成器在线,了解通话记录生成......
  • windows 下载安装 mysql
    windows安装mysql的社区版安装举例1.下载mysql地址:https://dev.mysql.com/downloads/下载完成后,得到下面文件mysql-installer-community-8.0.28.0.msi2.安装mysql2.1直接点击上面步骤中的文件,初始化安装程序2.2开始安装,选择默认安装即可2.3先点击"Execute",用于检查安装先决条......
  • 下载Babel
    Babel的用处:用处:把"ES6"转化为"ES5"1-下载:Babel命令:sudonpminstall--globalbabel-cli//全局安装测试是否安装成功-命令:babel--version2-配置.babelrc配置过程://存放在项目的根目录下,该文件用来设置转码规则和插件1-在根目录,加上:".babelrc"的配置文件......
  • 高精度地形DEM数据下载(NASA数据 12.5米分辨率)
    本文介绍从NASA阿拉斯加卫星设备处网站下载高精度DEM数据,下载的数据精度是12.5米分辨率。目前国内大部分可以下载的dem数据都是30米或90米分辨率的,对于更高精度的数据要不就是需要付费下载,要不就是涉密数据无法获取。下载地址:https://vertex.daac.asf.alaska.edu/# ASF(Alaska......
  • .NET几种微服务框架,你用过吗?
    最近有群友问,.NET有哪些微服务框架?.NET的微服务框架还真不多,一般企业都会自己搭建微服务框架,或者基于其它框架搭建微服务(比如abp)。本文将介绍几种微服务框架,供大家学习参考。一、ServiceFabric简介:ServiceFabric是一个微服务框架,它由微软开发并托管在Azure上。它提供了一......
  • 如何下载node指定版本
    首先卸载掉目前node然后搜索https://nodejs.org/download/release/vxx.xx.x/(需要的版本)最后选择下载安装就ok了 ps:我的版本不合适,项目需要指定版本,尝试过操作降版本,切换版本,忙活了几个小时,nnd不成功。。。。。最后只能用笨办法了......