首页 > 其他分享 >Ajax处理文件流下载

Ajax处理文件流下载

时间:2023-11-30 17:23:48浏览次数:43  
标签:function 文件 option param filename xhr Ajax var 下载

文件流下载封装

/*
* AJAX请求 后端返回文件流下载处理
* @param {object} option 下载请求选项配置
* @param {string} option.method 请求方式 POST|GET etc.
* @param {string} option.url 请求地址
* @param {string} option.filename 文件下载名称
* @param {number} option.timeout 请求超时时间 单位:毫秒
* @param {function} option.beforesend 请求发送前回调
* @param {function} option.ontimeout 请求超时回调
* @param {function} option.onprogress 请求响应体下载进度回调
* @param {function} option.innererror 接口内部自定义错误回调
* @param {function} option.outererror 接口外部异常回调 状态码非200的异常
* @param {function} option.error 接口异常回调
* @param {function} option.onresponsestart 响应开始传输回调
* @param {function} option.complete 响应传输结束|请求结束 回调
*/
function download(option){
    var xhr=new XMLHttpRequest();
    xhr.responseType='blob';//只有异步请求才能设置responseType,否则报错,所以这里只能是异步(存疑)
    xhr.open(option.method, option.url, true); //打开连接

    //请求发生之前回调
    if(typeof option.beforesend==='function')
    {
        option.beforesend(xhr);
    }

    //下载请求超时设置
    if(typeof option.timeout==='number')
    {
        xhr.timeout=option.timeout;
    }

    //下载超时回调
    xhr.ontimeout=typeof option.ontimeout==='function'?option.ontimeout:
    function(e){
        console.error('request timeout.');
    };

    
    //下载进度回调
    if(typeof option.onprogress==='function')
    {
        xhr.onprogress=option.onprogress;
    }

    //请求成功回调
    xhr.onload=function(){
        if(this.status===200)
        {
            var data = this.response;
            if(data.type.indexOf('application/json')>-1){
                var reader=new FileReader();
                reader.readAsText(data,'UTF-8');
                reader.onload=function(){
                    try{    
                        var res=JSON.parse(reader.result);
                        typeof option.innererror==='function'?
                        option.innererror(res):
                        console.error(res);
                    }
                    catch(e){
                        console.error(e);
                    }
                }
            }
            else
            {
                 /*
                 获取后台的下载文件名:如果跨域时Content-Disposition默认前端不给读取,需要后端API操作暴露给前端
                 */

                var disposition = decodeURI(xhr.getResponseHeader("Content-Disposition"))
                ,filename=option.filename||getFilenameFromDisposition(disposition)
                ,mimetype=xhr.getResponseHeader("Content-Type")
                
                //保存为文件下载
                saveAsFile(data, filename,mimetype);
            }
        }
        else
        {
            typeof option.outererror==='function'?option.outererror(xhr.status,xhr.statusText,xhr.response):
             console.error(xhr.status,xhr.statusText,xhr.response);
        }
    }

    //请求异常时触发,一般网络状态异常不通时会触发,例如:网络断开、无法连接目标服务器等
    xhr.onerror=typeof option.error==='function'?option.error:
    function(e){
        console.error('an error has occured.');
    };

    //响应数据开始传输
    if(typeof option.onresponsestart==='function')
    {
        xhr.onloadstart=option.onresponsestart;
    }
   

    //响应数据传输完成
    if(typeof option.complete==='function')
    {
        xhr.onloadend=option.complete;
    }
    
    //发生请求数据
    xhr.send(option.payload);
}

/*
* 将二进制流数据转换成具体文件下载
* @param {blob} data 二进制流数据
* @param {string} filename 文件下载名称
* @param {string} mimeType 文件MIME类型
*/
function saveAsFile(data,filename,mimeType)
{
     //兼容ie
    if ('msSaveOrOpenBlob' in navigator) 
    {
        var blob = new Blob([data], { type: mimeType });
        window.navigator.msSaveOrOpenBlob(blob, filename);
    } 
    else 
    {
        var blob = new Blob([data], { type: mimeType });
        var url = window.URL.createObjectURL(blob);
        var link = document.createElement('a');
        document.body.appendChild(link);
        link.style.display = 'none';
        link.download = filename;
        link.href = url;
        link.click();
        window.URL.revokeObjectURL(url);//手动释放blobURL,避免内存溢出 
        document.body.removeChild(link);
    }
}

/*
 * 获取文件下载名称
 * @param {string} disposition 请求响应头中的Content-Disposition
 */
function getFilenameFromDisposition(disposition){
    var filename='';
    if (disposition && disposition.indexOf('attachment') !== -1) {
        var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
        var matches = filenameRegex.exec(disposition);
        if (matches != null && matches[1]) {
            filename = matches[1].replace(/['"]/g, '');
        }
    }

    return filename;
}

示例

        download({
        method:'POST',
        url:'http:192.168.1.2/api/file/download',
        payload:JSON.stringify({
            "page": 1,
            "limit": 60000,
            "data": {
                sdate:'2023-10-01',
                edate:'2023-10-31'
            }
        }),
        filename:'西游记.xlsx',
        beforesend:function(xhr){
            xhr.setRequestHeader("content-type", "application/json;charset=UTF-8");
        },
        innererror:function(res){
            console.error(res.msg);
        },
        onresponsestart:function(e){
            console.log('文件流开始传输');
        },
        onprogress:function(event){
            if(event.lengthComputable){
            var percentage=(event.loaded/event.total).toFixed(4)*100;
            percentage+='%';
            console.log(percentage);
        }
        },
        complete:function(status,statusText,responseText){
            console.log('请求结束');
        }

    });

 

标签:function,文件,option,param,filename,xhr,Ajax,var,下载
From: https://www.cnblogs.com/artistx/p/17867832.html

相关文章

  • CTF中文件包含漏洞
    0x01什么是文件包含漏洞通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。0x02文件包含漏洞的环境要求allow_url_fopen=On(默认为On)规定是否允许从远程服务器或者网站检索数据allow_url_include=On(......
  • Git 文件状态的转换
     很好低使用git文件的状态转换的了解是非常重要的。文件转换状态其实可以分为四种:untracked:未跟踪,此文件在工作区中,但并没有加入git库,不参与版本控制。通过”gitadd”,”gitcommit”可将它置入跟踪库。unmodify:文件已经git库中,未修改,即版本库中的......
  • AutoCAD .NET 二次开发(2020版)选择特定对象另存为新文件
    如果需要从当前模型空间中选择部分图形,直接另存为一个新文件,可用如下方法//spObjectId对象的ID//path保存路径//注意,实际内部使用了ObjectIdCollection对象,一次可以保存多个IDpublicstaticvoidSaveObject(ObjectIdspObjectId,stringpath){varsourceDb=spOb......
  • axios(ajax)发送请求响应码200,但获取不到数据,无法加载响应数据: No datafound for res
    问题截图:没有响应数据控制台报错其实是由于浏览器的跨域资源共享(CORS)策略导致,前后端跨域请求是不行的。什么是域,看页面的url,比如https://www.baidu.com/下的网页都是属于baidu.com这个域。如果你是和我一样是从本地文件打开html的方式来调试ajax,那么一定会出现这个问题,因为本......
  • 文件目录规范
    【前言】规范、整洁的文件目录,让人心情愉悦的同时,还能降低维护的难度,增加项目的可读性 由于其可复制性,由此总结出一套适用于前端的文件目录模板。先来一张大体的目录格式: 【取名规则】名称遵循语义化组件名需使用大驼峰,例如:PlanSelect文件夹、文件按中划线拼接,例如:or......
  • Phthon中读写和存储.mat文件
    背景在做deeplearning过程中,使用caffe的框架,一般使用matlab来处理图片(matlab处理图片相对简单,高效),用python来生成需要的lmdb文件以及做test产生结果。所以某些matlab从图片处理得到的label信息都会以.mat文件供python读取,同时也python产生的结果信息也需要matlab来做进一步的处......
  • linux解压zip文件怎么操作
    Linux解压zip文件的操作非常简单,你可以使用命令行工具来完成这个任务。下面是详细的步骤: 1.打开终端:在Linux系统中,你可以通过点击终端图标或者使用快捷键Ctrl+Alt+T来打开终端。2.切换到zip文件所在的目录:使用cd命令切换到包含zip文件的目录。例如,如果zip文件位于/home/use......
  • 零代码编程:用ChatGPT批量下载某个网页中的特定网页链接
    以lexfridman的官方网站为例,https://lexfridman.com/podcast/,如何批量下载网页呢?查看网页源文件,播客transcript的链接是:<ahref="https://lexfridman.com/jared-kushner-transcript">Transcript</a>文件标题在这里:<title>TranscriptforJaredKushner:Israel,Palestine,Hamas......
  • 自定义bib文件
    一、使用在使用word编写论文时,需要使用参考论文格式,此时可以使用bib生成指定的格式,在放入文中进行使用。latex自带了一种bib参考格式的指令:latexmakebst通过上面的指令可以通过选项进行操作生成一个dbj文件。再通过对dbj文件的内容进行修改,就可以到一个目标的bst文件。但是......
  • python flask下载功能
    前言flask下载功能一、约定要下载文件绝对路径:/tmp/flask_web/download/test.tar.gzpy主程序:/tmp/flask_web/main.py二、main.py内容@app.route("/down/<path:filename>",methods=['GET','POST'])defdownload_file(filename):try:#......