接口获取二进制文件,使用a标签下载,不知道文件名。怎么解析获取文件名。

接口获取二进制文件,使用a标签下载,不知道文件名。怎么解析获取文件名。

  var blob = this.response;
  var reader = new FileReader();
        reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
        reader.onload = function (e) {
            // 转换完成,创建一个a标签用于下载
            var a = document.createElement('a');
            a.download = fileName;
            a.href = e.target.result;
            $('body').append(a); // 修复firefox中无法触发click
            a.click();
            $(a).remove();
            defer.resolve(true);
        };

如果没有fileName怎么使下载的文件自动获取自身的文件名。
此方法 下载 5、6mb的 文件 好像并不行 ,没有跳出文件选择框。
各位大大有什么好办法!!!

使用 fileSave的话保存好像也需要文件名。

阅读 5.3k
1 个回答

通过后端配合 根据 'Content-Disposition' 获取文件名。

  
  
        var xhr = new window.XMLHttpRequest();
        xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
        xhr.responseType = 'blob'; // 返回类型blob
        // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
        xhr.onload = function () {
            // 请求完成
            if (this.status === 200) {
                // 返回200
                var content = this.response;
               
                if (!fileName) fileName = new Date().format('yyyy年MM月dd日');
                var oldFileName = fileNameFromHeader(xhr.getResponseHeader('Content-Disposition'));
                if (oldFileName != null) {
                    if (fileName.lastIndexOf('.') <= 1) {
                        fileName = fileName + oldFileName.substring(oldFileName.lastIndexOf('.'));
                    } else {
                        fileName = fileName.substring(0, fileName.lastIndexOf('.')) + oldFileName.substring(oldFileName.lastIndexOf('.'));
                    }
                }
                try {
                    saveAs(content, fileName);
                } catch (error) {
                   
            } 
        };
        
         // 获得文件名
    function fileNameFromHeader (disposition) {
        var result = null;
        if (disposition && /filename=.*/ig.test(disposition)) {
            result = disposition.match(/filename=.*/ig);
            return decodeURI(result[0].split('=')[1]);
        }
        return null;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏