文件类型

  • 常见文件类型有,图片、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 实现线上文档文件下载相关推荐

  1. docsify安装(线上文档)

    01.docsify 是什么 一款神奇的文档生成利器 自从有了 Markdown, 我就再没用过富文本编辑器,因为 Markdown 的书写有一种心流的感觉.很多博客平台都支持 Markdown 了, ...

  2. 一个python网上文档

    找到了一个学习python的网上文档,内容很丰富,详细介绍各种API的用法,例子也很有趣 https://docs.python.org/3.3/library/index.html 下载python ...

  3. JavaScript读写.txt文档 - 方法篇

    JavaScript读写.txt文档:分析与方法 详情参考完整教程: Javascript本地写入txt和读取txt文件示例 案例篇:求HTML或者JS读取TXT文件内容的代码 以上就是关于 &quo ...

  4. javaScript读取txt文档的FSO对象和ADODB.Stream对象

    转自:http://blog.163.com/chaosumin@126/blog/static/86387403201092793610651 在使用JavaScript读取txt文档时,一般使用j ...

  5. html实现打开word文档,用javascript打开word文档的方法

    用javascript打开word文档的方法 首先我们新建一个html文件,并且写一个FileUpLoad以及button控件. 代码如下: 复制代码 代码如下: fileUpload 然后,在写一个 ...

  6. JavaScript之充实文档的内容

    1.我们在平时的开发中会碰到一些缩略语如:XML,HTML,API等专业术语:为了能使用户,更好的了解术语的意思,我们通常会给<abbr></abbr>标签加一个title属性 ...

  7. javascript 中文帮助文档_实战式方法学习JavaScript(1)

    案例1:表格行悬停提示效果 [参考文献] 1.JavaScript前端开发模块化教材(人民邮电出版社)赵健保 2.https://www.w3cschool.cn/ 任务导入: 在Web标准中,HTM ...

  8. html点击打开word文档,javascript打开word文档的方法

    首先我们新建一个html文件,并且写一个FileUpLoad以及button控件. 代码如下: 复制代码 代码如下: fileUpload 然后,在写一个javascript OpenFile方法. ...

  9. js+打开php文档,javascript打开word文档的方法_基础知识

    首先我们新建一个html文件,并且写一个FileUpLoad以及button控件. 代码如下: fileUpload 然后,在写一个javascript OpenFile方法. 代码如下: funct ...

最新文章

  1. 理解 Delphi 的类(十) - 深入方法[9] - 调用时的括号
  2. React 中 $$typeof 的作用
  3. 使用beanUtils操纵javabean
  4. 分库、分表、分区的区别,傻傻分不清?
  5. fastjson list转json字符串_程序员:JSON、JSONObject 与 JSONArray 简单讲解
  6. 树的同构(c语言静态链表实现)
  7. 关于IIS服务启动失败的问题:“IIS提示‘另一个程序正在使用此文件,进程无法访问’”,的解决方法...
  8. kafka之六:为什么Kafka那么快
  9. 关于excel导出问题
  10. (转)替换回车符为换行符
  11. 渗透测试工程师的Linux学习之路
  12. 2022软考网工笔记(网络安全)
  13. mysql中生成时间维度表
  14. JS:变量提升与临时性死区TDZ
  15. 数据链路层协议 ——— 以太网协议
  16. 预推免没有好offer,要尝试正式推免吗?
  17. 我学习从事项目经理第一个课
  18. 从零开始安装搭建win10与ubuntu20.04双系统开发环境——集安装、配置、软件、美化、常见问题等于一体的——超详细教程
  19. Qt制作简单标签云(上)
  20. 单片机的电子电路基本知识

热门文章

  1. 以太坊家族Swarm项目是何来头
  2. 程序员喜欢的5种小姐姐类型
  3. 圣歌 几个服务器位置,圣歌自由模式全地图标注汇总 资源及随机事件分布一览...
  4. 计算机共享后不能互相访问吗,怎么设置局域网共享(局域网间电脑不能互访)...
  5. 最详细MySql安装教程
  6. UVa 11759 洛克人的难题 状压dp
  7. ajax. jquery. 异步,jQuery之异步Ajax请求使用
  8. IP地址(内网与外网)
  9. 【脚本】关于扇贝单词生词本未学单词bug增强脚本
  10. 蓝牙2.4GHz 与 WiFi 2.4GHz 5GHz无线信道频率划分总结