• ajax下载文件的坑


    ajax是不能下载文件的,要么用form,要么用跳转

    function openExportTabs() {
                let exportUrl = "${webRoot}/report/totalityDataReportExport";
                if (!$("input[name='startTime']").val() || !$("input[name='endTime']").val()) {
                    alert("开始时间或者结束时间不能为空!");
                    return;
                }
                let startTime = $("input[name='startTime']").val();
                let endTime = $("input[name='endTime']").val();
                let busiFlag=$("#busiFlag").val();
                let url = exportUrl+"?startTime="
                    + startTime + "&endTime=" + endTime+"&busiFlag="+busiFlag;
                window.location.href=url;
               /* let result = ajaxUtil.get(url, "");
                if (result == "error") {
                    alert("操作出现异常");
                    return false;
                }*/
            }
    

      

    原因:

    Ajax下载文件的这种方式本来就是禁止的。出于安全因素的考虑,javascript是不能够保存文件到本地的,

    所以ajax考虑到了这点,只是接受json,text,html,xml格式的返回值,二进制的返回格式就会抛出这个异常。

    因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,

    然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。

    文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。

    解决方法:

    1、用window.open() 或 window.location.href():

    2、可以直接使用a标签实现文件下载:

    <a href=”下载地址”>点击下载</a>

        var aLink = document.createElement('a');
        aLink.download = "文件名";
        aLink.href = "文件url地址";
        document.body.appendChild(aLink);
        aLink.click();
        document.body.removeChild(aLink);

    3、可以使用jquery创建表单并提交实现文件下载:

    var form = $("<form>");
    form.attr("style","display:none");
    form.attr("target","");
    form.attr("method","post");
    form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do");
    var input1 = $("<input>");
    input1.attr("type","hidden");
    input1.attr("name","strZipPath");
    input1.attr("value",strZipPath);
    $("body").append(form);
    form.append(input1);
    form.submit();
    form.remove();

    4、使用隐藏iframe或新窗体解决:

    export const downloadFile = (url) => {
      const iframe = document.createElement("iframe");
      iframe.style.display = "none"; // 防止影响页面
      iframe.style.height = 0; // 防止影响页面
      iframe.src = url; 
      document.body.appendChild(iframe); // 这一行必须,iframe挂在到dom树上才会发请求
      // 5分钟之后删除(onload方法对于下载链接不起作用,就先抠脚一下吧)
      setTimeout(()=>{
        iframe.remove();
      }, 5 * 60 * 1000);
    }

    这个可以实现一次下载多个文件。

  • 相关阅读:
    一个matlab小程序:挑出沪市A股年报与一季度报在同一天发布的股票
    AWK
    matlab搜索路径
    从新浪财经上下载交易明细数据并统计每天的买卖笔数(shell 命令行)
    AWK截取字符串
    tar GNU
    工作效率上的错觉(转载)
    matlab双精度浮点数编码及区间覆盖(原创)
    DNS服务器设置(Ubuntu10.04)
    sed
  • 原文地址:https://www.cnblogs.com/JAYIT/p/14069107.html
Copyright © 2020-2023  润新知