jQuery的下载,需要承载一个插件去做

今天遇到一个问题,后台给的接口由于需要前端传入过多的参数,只能接受用post去下载文件。
正常情况下第一反应是用xhr对象去发送post请求,结果并没有触发浏览器的下载。

看了一下responseHeader里已经设置了content-dispositon:attachment,但是返回的流媒体会存在于接口返回的Response中。
试着window.open(URL.createObjectURL(new Blob(res))),只是inline的形式打开了这个文件,并没有触发浏览器下载行为。

最后发现,其实不是header的问题,问题是AJAX并不会唤起浏览器的下载窗口,AJAX设计的初衷就是用来实现异步刷新的,用以改善原始的form表单提交刷新页面的问题。具体的官方证据暂时还没找到,只有stackoverflow。

所以选择有以下:
1.说服后端使用get方式。

get的请求方式可以用window.open(url,'_self');配置使用

    1. 不适用AJAX,创建一个隐形的表单来提交,设置form的target为_blank来弹出下载对话框(推荐使用)。
    2. 如果是get请求也不建议直接使用AJAX去请求,否则传回来的流还是需要处理,建议使用隐形的a标签
    3. URL.createObjectURL(new Blob(res),利用前端H5提供的a的download属性来下载。IE11都不兼容。
    4. IE10、IE11有一个方法window.navigator.msSaveBlob可以将File或Blob对象保存到本地磁盘。
    5. 最坏的打算就是拿到那些流,转换为base64,可以直接放入a标签的href
      function download() {
      
      var url = 'download/?filename=aaa.txt';
      
      var xhr = new XMLHttpRequest();
      
      xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
      
      xhr.responseType = "blob"; // 返回类型blob
      
      // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
      
      xhr.onload = function () {
      
         // 请求完成
      
         if (this.status === 200) {
      
             // 返回200
      
             var blob = this.response;
      
             var reader = new FileReader();
      
             reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a表情href
      
             reader.onload = function (e) {
      
                 // 转换完成,创建一个a标签用于下载
      
                 var a = document.createElement('a');
      
                 a.download = 'data.xlsx';
      
                 a.href = e.target.result;
      
                 $("body").append(a);    // 修复firefox中无法触发click
      
                 a.click();
      
                 $(a).remove();
      
             }
      
         }
      };

如何应对POST方式下载文件的接口的更多相关文章

  1. 呵呵哒,LNMP下通过fread方式下载文件时,中文名称文件找不到文件

    哎,整整折腾一个下午. 本来好好的,thinkphp 自动的uniq方式保存的文件名,非要使用原文件名,真心蛋疼~~ 然后就只好写个脚本 把原来的所有文件都重新命名一下 - - 然后把数据库对应字段也 ...

  2. ajax方式下载文件

    在web项目中需要下载文件,由于传递的参数比较多(通过参数在服务器端动态下载指定文件),所以希望使用post方式传递参数.通常,在web前端需要下载文件,都是通过指定<a>标签的href属 ...

  3. Http方式下载文件

    代码: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System ...

  4. C# Http方式下载文件到本地类改进版

    在上文基础上增加了远程文件是否存在和本地文件是否存在的判断. 类代码: using System; using System.Collections.Generic; using System.Lin ...

  5. C# Http方式下载文件到本地类

    直接上代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  6. C# Http方式下载文件到本地

    下文代码是从网络(http://www.cnblogs.com/hayden/archive/2012/04/26/2472815.html)得来,亲测好用.我中修改了下格式和注释,版权属于原作者“舒 ...

  7. QT实现,通过URL下载文件的接口实现

    今天来把坑填上. 具体就是提供一个URL,并通过这个URL下载文件. MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H cla ...

  8. asp.net已流的方式下载文件

    string filePath = context.Server.MapPath("~/" + uploadFolder+"/"+file_name);//路径 ...

  9. java通过http方式下载文件

    package com.qiyi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

随机推荐

  1. RabbitMQ的交换机类型(三)

      RabbitMQ的交换机类型共有四种,是根据其路由过程的不同而划分成的 分别是Direct Exchange(直连交换机), Fanout Exchange(扇型交换机), Topic Excha ...

  2. axios 简单二次封装

    import axios from 'axios' import { Message } from 'element-ui'; // 设置baseURL //axios.defaults.baseUR ...

  3. Delphi 特性限定符

  4. STM32L1xx——ADC(中断/DMA)样例代码

    此代码欲实现的功能是:使用中断或者DMA的方式采集滑动变阻器采集到的电压值,使用单ADC单通道采样! (由于不是直接需要电压,所以转换函数我就没列出来,可根据自身需要去网上查到转换的函数.) 代码结构 ...

  5. P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

    二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; ; ; ; ], nxt[MAXM << ], f[MAXM ...

  6. layui多图上传实现删除功能

    在使用layui的多图上传时发现没有删除功能 在网上搜索解决办法时有的感觉太复杂有的不符合自己所需要的所以就自己动手 下面附上代码 HTML: <div class="layui-up ...

  7. [转]makefile学习

    原文: http://blog.fatedier.com/2014/09/08/learn-to-write-makefile-01/ -------------------------------- ...

  8. Redis主从复制(读写分离)(四)

    Redis主从复制(读写分离) 克隆三台linux虚拟机   9.1.1.克隆虚拟机   9.1.2.生成新的mack地址 9.1.3.主从复制配置 redis主从复制 概述 1.redis的复制功能 ...

  9. vscode+TCC快捷编译c语言

    1.安装vscode. 2.安装插件tcc.小巧,快速,符合ansi c, 法国大神级别程序员开发的编译器. 3.编写C代码,F10运行,即可得结果,对于验证一些语法很快捷,很方便.只需三步!!

  10. BZOJ 1022 / P4279 Luogu [SHOI2008]小约翰的游戏 (反Nim游戏) (Anti-SG)

    题意 反Nim游戏,两人轮流选一堆石子拿,拿到最后一个的输.问先手是否必胜. 分析 怎么说,分类讨论? 情形1:首先考虑最简单的情况,所有石子数都为1.那么奇数堆石子为必败,偶数为必胜 情形2:然后考 ...