jQuery+ajax实现文件下载功能

6,684 阅读1分钟

       前面写了一篇文章“jQuery Ajax-$.ajax()方法如何获取Response Headers”,里面文件下载功能的实现,主要用的是ajax()方法请求成功后的回调函数success(获取请求到的数据)以及请求完成后的回调函数complete(实现下载)。对于这种方法,我感觉不太合理,也不推荐。接下来将介绍更好的方法。具体如下:

      在该方法中,删除了请求完成后的回调函数complete,直接使用请求成功后的回调函数success来实现下载功能。代码如下:

function download(recordId) {
	// ajax支持的服务器返回数据类型有:xml、json、script、html,
	// 其他类型(例如二进制流)将被作为String返回,无法触发浏览器的下载处理机制和程序。
	$.ajax({
		url: "下载URL",
		method: "get",
		beforeSend: function (request) {
			request.setRequestHeader("token", sessionStorage.getItem('token'));
		},
		data: {//需要发送的数据
			recordId: recordId,
		},
		success: function (result, state, xhr) {//3个参数
        	        //result:请求到的结果数据
                        //state:请求状态(success)
                        //xhr:XMLHttpRequest对象
            
			// 从Response Headers中获取fileName
			let fileName = xhr.getResponseHeader('Content-Disposition').split(';')[1].split('=')[1].replace(/\"/g, '')
                        //获取下载文件的类型
			let type = xhr.getResponseHeader("content-type")
                        //结果数据类型处理
			let blob = new Blob([result], { type: type })

			//对于<a>标签,只有 Firefox 和 Chrome(内核)支持 download 属性
			//IE10以上支持blob,但是依然不支持download
			if ('download' in document.createElement('a')) {//支持a标签download的浏览器
				//通过创建a标签实现
				let link = document.createElement("a");
				//文件名
				link.download = fileName;
				link.style.display = "none"
				link.href = URL.createObjectURL(blob);
				document.body.appendChild(link);
				link.click();//执行下载
				URL.revokeObjectURL(link.href);//释放url
				document.body.removeChild(link);//释放标签
			} else {//不支持
				if (window.navigator.msSaveOrOpenBlob) {
					window.navigator.msSaveOrOpenBlob(blob, fileName)
				}
			}
		},
	})
}

如图所示: