传统上,客户端将依靠浏览器来处理从服务器下载文件。然而,这种方法需要打开一个新的浏览器窗口,iframe或任何其他类型的不友好和黑客行为。为下载请求添加额外的头信息也很困难。更好的解决方案是使用HTML5 File API以及XMLHttpRequest或请求库。

File API允许您在浏览器中创建,加载和操作文件。我们可以使用a Blob 创建一个内存文件:

const blob = new Blob(['lorem ipsum'],{type:'text / plain'});

通过一些额外的工作,我们可以将这个文件下载到我们的文件系统中:

index.html

<DIV>

<a href='#' id='trigger'>创建并下载Lorem Ipsum </a>

</ DIV>

main.js

const trigger = document.querySelector('#trigger');

trigger.addEventListener('click',()=> {

const blob = new Blob(['lorem ipsum'],{type:'text / plain'});

blob.name ='lorem.txt'

const reader = new FileReader();

reader.onload = e => {

const anchor = document.createElement('a');

anchor.style.display ='none';

anchor.href = e.target.result;

anchor.download = blob.name;

anchor.click();

};

reader.readAsDataURL(BLOB);

});

这是一个工作示例。当你点击trigger时,我们创建一个抛弃锚点元素,它接收一个下载属性,其中包含我们想要保存的文件名以及由此生成的URL,

readAsDataURL()它实际上表示我们的数据为base64编码的字符串。然后,我们模拟新的元素上的点击事件来触发下载。

现在让我们从httpbin获取一个图像:

index.html

<DIV>

<a href='#' id='trigger'>请求图片和下载</a>

<img />

</ DIV>

main.js

我们正在为xxxx.org创建对JPEG图像的请求,并使用与之前相同的逻辑,将图像数据加载到一个blob

并将其下载到用户文件系统。

利用这种技术,我们可以优雅地将我们需要的所有额外属性添加到ajax请求中。你甚至可以将它包装在一个漂亮的Vue.JS或React组件中。

DEMO下载地址:https://dwz.cn/Jw3z6fVq

js之Ajax下载文件的更多相关文章

  1. 如何用ajax下载文件

    引子 在HTML5没来之前,浏览器想要下载文件,可能有这么几种方式: 借助a标签,<a href="学习资料.xlsx"></a> window.locat ...

  2. Ajax 下载文件 文件被损坏

    问题表现 Ajax 下载文件成功后,打开提示格式损坏,源代码如下: axios({ method: 'get', url: "/public/工作簿1.xlsx", // 静态资源 ...

  3. Ajax下载文件(页面无刷新)

    说明:Ajax是无法实现文件传输的,本文只是模拟了Ajax不刷新页面就可以请求并返回数据的效果.实质上还是通过提交form表单来返回文件流的输出. 分步实现逻辑: ajax请求服务器,访问数据库,根据 ...

  4. js通过 URL下载文件

    页面上一个button,点击之后触发一个function去请求数据,返回 pdf/epub 的URL,然后下载这个文件. 本来是直接用 a 写的,href里放资源地址,target设为'_blank' ...

  5. jQuery用FormData对象实现文件上传以及如何通过ajax下载文件

    之前在Vue的项目里面用到过文件上传,封装好的组件用起来比较顺手,查询Element-UI文档,十八般武器样样都有,一顿操作猛如虎,一看--跑偏了(⊙o⊙)-,我的意思就是用框架实现比较简单,但是如果 ...

  6. 怎么用ajax下载文件

    可能大家都觉得没有必要用ajax来下载东西,用window.open(url)就可以搞定 但是这有一个问题,就是这就限定了只能用GET方式来请求了: 可能你又会说GET很符合REST的要求呀. 但是如 ...

  7. python django + js 使用ajax进行文件上传并获取上传进度案例

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 原生js实现ajax的文件异步提交功能、图片预览功能.实例

    采用html5使得选择图片改变时,预览框中图片随之改变.input文件选择框美化.原生js完成文件异步提交 效果图: 代码如下,可直接复制并保存为html文件打开查看效果 <html> & ...

  9. jquery.form.js ie 下下载文件已经ie8失效问题解决方案

    https://github.com/malsup/form/blob/master/jquery.form.js在使用这个插件时遇到的问题1.ie下会变成下载文件,解决方案是在后端返回时设置'Con ...

随机推荐

  1. tensorflow,model,object_detection,训练loss先下降后递增,到几百万,解决tensorflow,model,object,detection,loss,incease

    现象:训练loss一开始下降一部分,跌代到若干次(具体多少和你的learning rate大小有关,大就迭代小就发生,小就需要多几次迭代) 日志如下(下面的日志来源于网络,我自己的日志已经clear掉 ...

  2. Could not HEAD 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.2.0/gradle-3.2.0.pom'.

  3. CentOS7 yum安装配置 drbd-84-utils (外部模式)

    1 安装环境介绍 1.1 系统环境 内核:3.10.0-862.el7.x86_64  版本:CentOS Linux release 7.5.1804 (Core) 主服务器:hostname = ...

  4. 【算法】BM算法

    目录 BM算法 一. 字符串比较的分析 二.BM算法的思想 三.算法实现 BM算法 @ 一. 字符串比较的分析 如果要判定长度为\(n\)两个字符串相等,比较中要进行\(n\)比较,但是如果要判定两个 ...

  5. ReentrantLock示例说明

    1.ReentrantLock锁 import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; impor ...

  6. 大数据学习(一)-------- HDFS

    需要精通java开发,有一定linux基础. 1.简介 大数据就是对海量数据进行数据挖掘. 已经有了很多框架方便使用,常用的有hadoop,storm,spark,flink等,辅助框架hive,ka ...

  7. Linux静态设置CentOS 7虚拟机的IP

    进入root ,输入命令:# vi /etc/sysconfig/network-scripts/ifcfg-ens33 .将DHCP协议获取IP,改为static静态,加上想要设置的IPADDR即可 ...

  8. JS整理--闭包

    1.闭包可以访问当前函数以外的变量 function a(){ var date="1"; function b(str){ console.log(str+date) } ret ...

  9. 现代编译原理——第二章:语法分析之LL(K)

    转自: http://www.cnblogs.com/BlackWalnut/p/4472122.html LL(K)语法分析技术是建立在预测分析的技术之上的.我们先来了解预测分析技术.考虑以下文法: ...

  10. Saliency Detection: A Spectral Residual Approach

    Saliency Detection: A Spectral Residual Approach 题目:Saliency Detection: A Spectral Residual Approach ...