• 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">
    <ul>
    ' ;
            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浏览器
        }
  • 相关阅读:
    Python环境搭建详解(Window平台)
    扎心了Python
    解决Git
    Android入门教程(四)
    HEXO快速搭建自己的博客
    每日Android一问等你来解答-什么是Activity的生命周期?
    如何才能够系统地学习Java并发技术?
    LeetCode刷题指南(字符串)
    学生时代的最后一个新年,请一定要做这五件事
    20位程序员关于求职的疑问,以及我给出的参考答案
  • 原文地址:https://www.cnblogs.com/nixindecat/p/12156952.html
Copyright © 2020-2023  润新知