JavaScript tips —— 关于下载与导出的二三事

简介:

前言

在项目中经常会遇到下载或导出服务端资源的需求,一般分为2种做法
  1. 获取文件流,编码后下载
  2. 获取文件的url,直接下载
本文主要探讨第二种方法,在最后会提及文件流的方法。


浏览器的安全策略

在介绍方法之前,我们需要知道浏览器的一些安全机制,防止恶意代码对用户的破坏。
现代浏览器(ie8除外)检测到非用户直接操作产生的新窗口,一般会阻止,比如在ajax的回调中打开新的窗口,因为这些操作并不是在用户点击的线程中,所以会拦截。


预开新标签页

做法

  1. 在异步操作之前,先打开一个新标签页
  2. 请求后端资源的地址
  3. 获取url后去修改空白页的url

const downloadTab = window.open('about:blank');

ajax.get('xxx').then(url => {
    // 使用后端资源的url进行下载
    downloadTab.location.href = href;
}).catch(err => {
    // 处理异常
    downloadTab.close();
})

缺点

  1. 不管请求成功还是失败都会有新页面的闪烁出现
  2. 打开的新页面在什么时候关闭是个问题,因为如果请求时间过长,用户可能自己关闭新页面,更不好处理的情况是页面什么时候触发了下载,因为如果只是更改url就关闭窗口可能还没有开始下载的操作。


生成iframe

做法

为了避免页面闪烁与关闭时机的问题,可以在当前页面使用动态创建iframe的方式,直接下载

ajax.get('xxx').then(href => {
    if (!href) {
      return;
    }

    if (!this.downIframe) {
      this.downIframe = document.createElement('iframe'); // 动态创建iframe
      this.downIframe.src = href; // iframe 中加载的页面
      this.downIframe.id = 'downloadIframe'; // iframe 中加载的页面
      this.downIframe.style.width = '1px';
      this.downIframe.style.height = '1px';
      this.downIframe.style.position = 'absolute';
      this.downIframe.style.left = '-100px';
      document.body.appendChild(this.downIframe); // 添加到当前窗体
    } else {
      this.downIframe.src = href; // iframe 中加载的页面
    }
}).catch(err => {
    // 处理异常
})

缺点

虽然可以优雅的下载文件了,可是如果需要定制下载文件的名称就会令人头疼了,我们需要时机去改变下载文件的名称,否则就会使服务端的文件名称。


生成标签

利用download属性设置文件名,


0ca6df19dff4c25687376d33742502ab527eddfc


ajax.get('xxx').then(href => {
    if (!href) {
      return;
    }

    var a = document.createElement('a');
    var url = href;
    var filename = 'test.zip';
    a.href = url;
    a.download = filename; // 在没有download属性的情况,target="_blank",仍会阻止打开
    a.click();
}).catch(err => {
    // 处理异常
})

注意:
有些浏览器需要将a标签嵌入页面才可执行。


处理文件流

最后大概讲一下如果后端返回流怎么处理。


function funDownload(content, filename) {
    // 创建隐藏的可下载链接
    var link = document.createElement('a');
    link.download = filename;
    link.style.display = 'none';

    // 字符内容转变成blob地址
    var blob = new Blob([content]);
    //如果是excel格式
    //var blob = new Blob([content], {type: 'application/vnd.ms-excel'}),
    link.href = URL.createObjectURL(blob);

    // 触发点击
    document.body.appendChild(link);
    link.click();
    // 然后移除
    document.body.removeChild(link);
};

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。


注意:
在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象,即使你已经用相同的对象作为参数创建过。当不再需要这些 URL 对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法来释放。浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,你应该在安全的时机主动释放掉它们。


原文发布时间为:2018年06月15日
原文作者:nanchenk

本文来源: 掘金 如需转载请联系原作者



相关文章
|
2月前
|
Web App开发 存储 数据处理
Chrome 下载大文件报错!用 Streamsaver.js 完美填坑
本文探讨了Chrome下载大文件报“网络错误”的原因及解决方案。由于Chrome对Blob数据有大小限制,导致大文件下载失败。通过将responseType改为ArrayBuffer可临时解决1-2G文件问题,但超3G仍会崩溃。最佳方案是使用Streamsaver.js实现流式下载,边接收边保存,避免内存溢出,完美支持超大文件下载。
585 3
|
6月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
数据采集 Web App开发 JavaScript
Puppeteer自动化:使用JavaScript定制PDF下载
在现代Web开发中,自动化工具如Puppeteer可显著提升效率并减少重复工作。Puppeteer是一款强大的Node.js库,能够控制无头Chrome或Chromium浏览器,适用于网页快照生成、数据抓取及自动化测试等任务。本文通过示例展示了如何使用Puppeteer自动化生成定制化的PDF文件,并介绍了如何通过配置代理IP、设置user-agent和cookie等技术增强自动化过程的灵活性与稳定性。具体步骤包括安装Puppeteer、配置代理IP、设置user-agent和cookie等,最终生成符合需求的PDF文件。此技术可应用于报表生成、发票打印等多种场景。
517 6
Puppeteer自动化:使用JavaScript定制PDF下载
|
10月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
414 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
10月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
278 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
10月前
|
JavaScript 前端开发
Node.js 中实现多任务下载的并发控制策略
Node.js 中实现多任务下载的并发控制策略
293 15
|
前端开发 JavaScript 数据处理
前端新手指南:如何解决JavaScript导出CSV文件不完整的问题
【6月更文挑战第4天】在JavaScript中处理CSV文件时,需要特别注意一些特殊字符,例如逗号、双引号、换行符等。这些字符可能会影响CSV文件的解析,导致数据错乱。
432 0
|
JavaScript 算法 内存技术
如何降低node.js版本(nvm下载安装与使用)
如何降低node.js版本(nvm下载安装与使用)
|
存储 JSON JavaScript
学习node.js十三,文件的上传于下载
学习node.js十三,文件的上传于下载
|
JavaScript 前端开发 程序员
《JavaScript权威指南第7版》中文PDF+英文PDF+源代码 +JavaScript权威指南(第6版)(附源码)PDF下载阅读分享推荐
JavaScript是Web标准语言,广泛应用于各类浏览器,造就了其最广泛部署的地位。Node.js的兴起扩展了JavaScript的使用场景,使其成为开发者首选语言。无论新手还是经验丰富的程序员,都能受益于学习JavaScript。[《JavaScript权威指南第7版》资源链接](https://zhangfeidezhu.com/?p=224)
1110 5
《JavaScript权威指南第7版》中文PDF+英文PDF+源代码 +JavaScript权威指南(第6版)(附源码)PDF下载阅读分享推荐

热门文章

最新文章