JS下载文件方法(谷歌下载超过3M,downloadJS会报网络错误)

一、form表单提交

$('#get_res').on('click', function () {
    var form = $("<form>");
    form.attr("style", "display:none");
    $("<input>", {name: 'fileid', value: file_id}).appendTo(form);
    $("<input>", {name: 'path', value: docx_path}).appendTo(form);
    form.attr("target", "");
    form.attr("method", "get");
    form.attr("action", path + '/download');
    $("body").append(form);
    form.submit();
    });

二、download.Js

//下载开始
    $('body').on('click','.opendown',function () {
       $.ajax({
            url:'/showfile',type:'post',data:{'bianhao':$(this).text()},
            traditional: true, datatype: 'json',
            success: function (args) {
                console.log(args);
                var res = JSON.parse(args);
                console.log('公司',res.company);
                console.log('数据',res.data);
                layui.use('layer', function () {
                    layui.layer.open({
                        type: 1, shadeClose: false,
                        title: '下载列表', area: ['320px', '300px'],
                        content: createhtml(res)});
                });
            }
        });
    });
    //JS生成下载列表
    function createhtml(res) {
        var str = '';
        str += '<div id="my_model">\n<ul>\n' ;
        if (res.data instanceof Array) {
            for (var i = 0;i<res.data.length;i++){
                str+= '<li class="my_download" title= "'+ res.company +'">' + res.data[i] + '</li>'
            }
        }else {
            str+= '<li class="my_download" title= "'+ res.company +'">' + res.data + '</li>'
        }
        str += '</ul></div>';
        return str
    }
    //获取文件类型
    function getType(file){
            var filename=file;
            var index1=filename.lastIndexOf(".");
            var index2=filename.length;
            var typename = filename.substring(index1,index2);
            return typename;
    }
    
    //点击文件名触发下载
    $('body').on('click','.my_download',function () {
        var thisdata = $(this).text();var filetype = '';
        var datas = {'docname': thisdata,'supplier': $(this).attr('title')};
        console.log(thisdata);
        console.log(getType(thisdata));
        if (getType(thisdata)=='.pdf'){filetype = 'file/pdf'}
        if (getType(thisdata)=='.jpg'){filetype = 'image/jpg'}
        if (getType(thisdata)=='.png'){filetype = 'image/png'}
        $.ajax({
            url:'/getfile',type:'post',data:datas,
            success:function (args) {
                var res = JSON.parse(args)
                console.log(res);
                console.log(res.data);
                //此处引用了download.js 接受字节流 res.data为字节流编码
                download("data:"+ filetype + ";base64,"+res.data, thisdata, filetype);
            }
        })
    });
    ////下载结束

 

三、Blob方式

if (brow == 'Chrome') {
      //如果浏览器为谷歌(数据流大于3M时使用downloadJs下载会报网络错误)使用Blob方式下载
      Blobdownload('数据流', '文件类型')
    } else {
      //使用 Download Js 插件 方法
      download("data:" + '文件类型' + ";base64," + '数据流', "文件名", "文件类型")
    }
    // Blob下载主方法(数据流,文件名,文件类型)
    function Blobdownload(content, filename, filetype) {
      //调用base64ToBlob方法生成Blob对象
      const blob = base64ToBlob(content, filetype)
      const a = document.createElement("a")
      const url = window.URL.createObjectURL(blob)
      const filename = filename;
      a.href = url
      a.download = filename
      a.click();
      window.URL.revokeObjectURL(url)
    }
    // 生成Blob对象的方法(base64流,文件类型)
    function base64ToBlob(data, type) {
      //window.atob用于解码使用 base-64 编码的字符串
      const bytes = window.atob(data);
      //ArrayBuffer又称类型化数组,类型化数组是JavaScript操作二进制数据的一个接口
      const ab = new ArrayBuffer(bytes.length);// 生成了字节长度为bytes.length的内存区域
      const ia = new Uint8Array(ab);
      for (let i = 0; i < bytes.length; i++) {
        ia[i] = bytes.charCodeAt(i);
      }
      return new Blob([ab], { type: type })
    }

    function myBrowser() {
      var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
      var isOpera = userAgent.indexOf("Opera") > -1;
      if (isOpera) {
        return "Opera"
      }; //判断是否Opera浏览器
      if (userAgent.indexOf("Firefox") > -1) {
        return "FF";
      } //判断是否Firefox浏览器
      if (userAgent.indexOf("Chrome") > -1) {
        return "Chrome";
      }
      if (userAgent.indexOf("Safari") > -1) {
        return "Safari";
      } //判断是否Safari浏览器
      if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
        return "IE";
      }; //判断是否IE浏览器
    }
posted @ 2020-01-06 16:22  xiaomogugu  阅读(2532)  评论(0编辑  收藏  举报