• 前端文件下载方案对比


      文件下载是前端一个十分常见的需求,但是系统的设计不同,会采用不同的实现方案,以下就几种情况做说明。

      一、下载链接不需要用户认证

        这种情况是最简单的,直接使用window的open方法来实现即可。如果不想另外弹出窗口,可以内置一个iframe并隐藏它,然后把链接赋值给iframe的src即可,简单暴力。

      二、下载链接需要用户认证

        如果系统的用户认证是基于cookie,那么依然可以使用上述方法实现,不赘述。

        如果系统的用户认证是基于token,我们在发送下载请求的时候需要传递token,有两种办法

        1、挂在url后面作为参数的一部分,这种方法在url里暴露了token,不安全,不推荐

        2、使用xhr异步请求来下载,这种方式,我们可以把token放在请求头中,或者参数体中,请求的方法可以是post。

        使用axios的方案时,下载的文件常遇到打不开的情况,文件损坏,大小也会翻倍,应该是编码不一致导致,这里我们使用原始的xmlhttprequest来实现,代码如下:

     1 var download= function (method, url, data,isDown) {
     2     var xhr = new XMLHttpRequest();
     3     xhr.open(method, url, true);
     4     xhr.setRequestHeader("token", localStorage.getItem('token'))
     5     xhr.responseType = 'blob';
     6     xhr.onload = function() {
     7         if (this.status === 200) {
     8             var type = xhr.getResponseHeader('Content-Type');
     9             var blob = new Blob([this.response], {type: type});
    10             var filename = xhr.getResponseHeader('content-disposition').replace(/w+;filename=(.*)/, '$1')
    11             if (typeof window.navigator.msSaveBlob !== 'undefined') {
    12                 window.navigator.msSaveBlob(blob, filename);
    13             } else {
    14                 var URL = window.URL || window.webkitURL;
    15                 var objectUrl = URL.createObjectURL(blob);
    16                 if (filename) {
    17                     var a = document.createElement('a');
    18                     if (typeof a.download === 'undefined') {
    19                         window.location = objectUrl;
    20                     } else {
    21                         a.href = objectUrl;
    22                         if(isDown){
    23                             a.download =  decodeURI(filename);
    24                         }
    25                         document.body.appendChild(a);
    26                         a.click();
    27                         a.remove();
    28                     }
    29                 } else {
    30                     window.location = objectUrl;
    31                 }
    32             }
    33         }
    34     }
    35     xhr.send(JSON.stringify(data));
    36 }
  • 相关阅读:
    详细的描述一个测试活动完整的过程
    黑盒测试的测试用例常见设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。
    测试计划工作的目的是什么?测试计划文档的内容应该包括什么?其中哪些是最重要的?
    redo log 有什么作用?
    Spring的简介和优点?
    java的语法基础(二)
    相对于Statement,PreparedStatement的优点是什么?
    MyBatis 的好处是什么?
    python中字符串的编码和解码
    相对于Statement,PreparedStatement的优点是什么?
  • 原文地址:https://www.cnblogs.com/niusj/p/13807631.html
Copyright © 2020-2023  润新知