JavaScript 实现线上文档文件下载
文件类型
- 常见文件类型有,图片、pdf、word、excel、txt 等
- 不同文件实现下载时,请求头类型不一致,所以要获取到文件类型
- 在已知文件路径的情况下,我采用 split 方法获取文件类型
// 已知文件线上路径
let fileUrl1 = 'https://XXX.XXX/XX/test.doc';
let fileUrl2 = 'http://XXX/test.txt';
let fileUrl3 = 'https://XXX-XXX-XX/test.pdf';
let fileUrl4 = 'https://XXX/XXX/XX/test.png';
let fileUrl5 = 'https://XXX.XXX/XX/test.xls';
function getFileType(url){if(url) {// 先用斜杠截取let tempArr1 = url.split('/');// 获取到截取结果的最后一位,即文件名称let fileName = tempArr1[tempArr1.length-1];// 再用点截取let tempArr2 = fileName.split('.');// 得到文件类型let type = tempArr2[1];return type;}else {return '';}
}
let type1 = getFileType(fileUrl1);// doc
let type2 = getFileType(fileUrl2);// txt
let type3 = getFileType(fileUrl3);// pdf
let type4 = getFileType(fileUrl4);// png
let type5 = getFileType(fileUrl5);// xls
console.log(type1,type2,type3,type4,type5);
- 在以上方法适用时,将常见文件类型大致分为四类,其中除了 img 类型和 txt 类型,进行下载功能是,都需要有特殊的请求头属性
let type = ''
if (typeFront == 'jpg' || typeFront == 'jpeg' || typeFront == 'png') {type = 'img'
} else if (typeFront == 'pdf') {type = 'pdf' // application/pdf
} else if (typeFront == 'doc' || typeFront == 'doxc') {type = 'word' // application/msword
} else if (typeFront == 'xlsx' || typeFront == 'xls') {type = 'excel' // application/vnd.ms-excel
}
图片类型文件的下载
- 将图片重绘到本地,得到图片新路径
- 创建 a 标签,根据图片新路径,实现下载功能
// 创建图片对象
let image = new Image();
image.onload = function () {let canvas = document.createElement('canvas');canvas.width = this.naturalWidth;// H5 属性,获取图片原始宽度canvas.height = this.naturalHeight;// H5 属性,获取图片原始高度// 在画布上重绘图像canvas.getContext('2d').drawImage(image, 0, 0);// 获取到重绘的图片对象--base64 编码let result = canvas.toDataURL('image/png');// 创建标签const link = document.createElement("a");link.href = result;// a 标签设置 download 属性,直接下载图片link.setAttribute("download", '获取到的图片名称.png');document.body.appendChild(link);link.click();link.remove();
};
// 跨域获取当前图片
image.setAttribute("crossOrigin", 'Anonymous');
image.src = url;// url 为图片原本的线上地址
文档类型文件的下载
- 基于 window 的 fetch() 实现简单请求,模拟下载接口事件
- 使用 blob() 方法获取到 Blob 对象
- 使用 createObjectURL 获取到 DomString
// url 为文件的线上地址
fetch(url, {method: "get",mode: "cors",
})
.then((response) => response.blob())
.then((res) => {const downloadUrl = window.URL.createObjectURL(//new Blob() 对后端返回文件流类型处理new Blob([res], {type: type == "pdf" ? "application/pdf" : type == "word" ?"application/msword" : type == "excel" ? "application/vnd.ms-excel" : ""}));// 创建标签const link = document.createElement("a");// 对处理后的文件进行标签绑定link.href = downloadUrl;link.setAttribute("download", data.name);document.body.appendChild(link);link.click();link.remove();
}).catch((error) => {window.open(url);
});
对以上方法进行封装
// 下载各类型文件
// downloadUrl--文件线上地址
export function downloadPaper(downloadUrl) {// 获取文件类型let type = getFileType(downloadUrl);// 获取文件名称let fileName = getFileName(downloadUrl);if (type == 'img') {downloadImg(downloadUrl).then((res) => {// 创建标签const link = document.createElement("a");link.href = result;// a 标签设置 download 属性,直接下载图片link.setAttribute("download", '获取到的图片名称.png');document.body.appendChild(link);link.click();link.remove();}).catch((err) => {console.log(err);})} else {downloadFile({url: downloadUrl,type: type,name: fileName})}
}
function getFileType(url){if(url) {// 先用斜杠截取let tempArr1 = url.split('/');// 获取到截取结果的最后一位,即文件名称let fileName = tempArr1[tempArr1.length-1];// 再用点截取let tempArr2 = fileName.split('.');// 得到文件类型let type = tempArr2[1];let myType = ''if (type == 'jpg' || type == 'jpeg' || type == 'png') {myType = 'img'} else if (type == 'pdf') {myType = 'pdf'} else if (type == 'doc' || type == 'doxc') {myType = 'word'} else if (type == 'xlsx' || type == 'xls') {myType = 'excel'}return myType;}else {return '';}
}
function getFileName(url){if(url) {// 先用斜杠截取let tempArr1 = url.split('/');// 获取到截取结果的最后一位,即文件名称let fileName = tempArr1[tempArr1.length-1];return fileName;}else {return '';}
}
// 下载图片
function downloadImg(url) {return new Promise((resolve, reject) => {// 重绘图片let image = new Image();image.onload = function () {let canvas = document.createElement('canvas');canvas.width = this.naturalWidth;canvas.height = this.naturalHeight;canvas.getContext('2d').drawImage(image, 0, 0);let result = canvas.toDataURL('image/png')resolve(result);};// 跨域获取当前图片image.setAttribute("crossOrigin", 'Anonymous');image.src = urlimage.onerror = () => {reject(new Error('urlToBase64 error'));};})
}
// 下载文件
function downloadFile(data) {fetch(data.url, {method: "get",mode: "cors",}).then((response) => response.blob()).then((res) => {const downloadUrl = window.URL.createObjectURL(//new Blob() 对后端返回文件流类型处理new Blob([res], {type: data.type == "pdf" ? "application/pdf" : data.type == "word" ?"application/msword" : data.type == "excel" ? "application/vnd.ms-excel" : ""}));//word文档为msword,pdf文档为pdfconst link = document.createElement("a");link.href = downloadUrl;link.setAttribute("download", data.name);document.body.appendChild(link);link.click();link.remove();}).catch((error) => {window.open(url);});
}
JavaScript 实现线上文档文件下载相关推荐
- docsify安装(线上文档)
01.docsify 是什么 一款神奇的文档生成利器 自从有了 Markdown, 我就再没用过富文本编辑器,因为 Markdown 的书写有一种心流的感觉.很多博客平台都支持 Markdown 了, ...
- 一个python网上文档
找到了一个学习python的网上文档,内容很丰富,详细介绍各种API的用法,例子也很有趣 https://docs.python.org/3.3/library/index.html 下载python ...
- JavaScript读写.txt文档 - 方法篇
JavaScript读写.txt文档:分析与方法 详情参考完整教程: Javascript本地写入txt和读取txt文件示例 案例篇:求HTML或者JS读取TXT文件内容的代码 以上就是关于 &quo ...
- javaScript读取txt文档的FSO对象和ADODB.Stream对象
转自:http://blog.163.com/chaosumin@126/blog/static/86387403201092793610651 在使用JavaScript读取txt文档时,一般使用j ...
- html实现打开word文档,用javascript打开word文档的方法
用javascript打开word文档的方法 首先我们新建一个html文件,并且写一个FileUpLoad以及button控件. 代码如下: 复制代码 代码如下: fileUpload 然后,在写一个 ...
- JavaScript之充实文档的内容
1.我们在平时的开发中会碰到一些缩略语如:XML,HTML,API等专业术语:为了能使用户,更好的了解术语的意思,我们通常会给<abbr></abbr>标签加一个title属性 ...
- javascript 中文帮助文档_实战式方法学习JavaScript(1)
案例1:表格行悬停提示效果 [参考文献] 1.JavaScript前端开发模块化教材(人民邮电出版社)赵健保 2.https://www.w3cschool.cn/ 任务导入: 在Web标准中,HTM ...
- html点击打开word文档,javascript打开word文档的方法
首先我们新建一个html文件,并且写一个FileUpLoad以及button控件. 代码如下: 复制代码 代码如下: fileUpload 然后,在写一个javascript OpenFile方法. ...
- js+打开php文档,javascript打开word文档的方法_基础知识
首先我们新建一个html文件,并且写一个FileUpLoad以及button控件. 代码如下: fileUpload 然后,在写一个javascript OpenFile方法. 代码如下: funct ...
最新文章
- iOS开发 Xcode8中遇到的问题及改动
- ASP.NET.CORE发布后启动网站出现500.19-0x8007000d错误解决方法
- mysql外键教程_关于MySQL外键的简单学习教程
- elementary安装Java,elementary os怎么样安装java
- 基于Java springboot+vue+redis前后端分离家具商城平台系统设计和实现
- 我究竟为什么要每天埋头写代码?
- 犯罪分子社工GoDaddy 员工,获得密币相关网站域名的控制权
- STM32标准库与HAL库中的Mode和Pull设置
- lm317扩流电路 (全集)
- 计算机不识别固态硬盘,电脑经常不识别固态硬盘
- 研究发现多种精神疾病和肠道微生物群的紊乱有关
- android 表情工厂,表情工厂安卓版
- vue中svg转png下载
- 拉普拉斯矩阵(Laplacian matrix)及其变体详解
- 2022鲁大师评测沟通会开启汽车评测新赛道
- 【uni-app】uni-app实现聊天页面功能——功能篇(下)
- 图数据库初探相关——1.Simulating Mobile Money Fraud pt.1(模拟移动支付诈骗)翻译
- 【微信小程序丨第三篇】小程序的基础知识储备
- C语言定义字符串和字符数组
- Noise2Void 的一些学习总结
热门文章
- 爆笑,绝对会爽到骨头里的笑话
- 2018苹果开发者账户忘记密保问题,导致协议无法更新解决方法(脱坑呀)
- Tinsea MKS3手机麦克风简单评测
- 从苏宁电器到卡巴斯基第16篇:我在苏宁电器当营业员 VIII
- 《不思议地下城》10.27正式上线链游玩家|秘境城堡、勇敢冒险
- HTML期末大作业~ 大话西游之大圣娶亲电影4页面 ~学生网页设计作业源码(HTML+CSS+JS)
- Dotween Path 路径动画使用方法详解
- 已知空间圆弧曲线的两点以及圆心半径,用matlab画出圆弧
- python写一个简单的爬虫程序(爬取快手)(附源码)
- Docker镜像仓库(账号密码与Https访问)