在Web開(kāi)發(fā)中,通常會(huì)遇到需要將服務(wù)器端的數(shù)據(jù)以下載的方式提供給用戶的情況。而使用jQuery中的ajax()方法則可以簡(jiǎn)便地實(shí)現(xiàn)這一功能。
$.ajax({ method: "GET", url: "example.php", data: {fileId: "12345"}, xhrFields: { responseType: 'blob' }, success: function (data) { var a = document.createElement('a'); var url = window.URL.createObjectURL(data); a.href = url; a.download = 'example.pdf'; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); } });
以上代碼中,通過(guò)設(shè)置xhrFields的responseType屬性為blob,我們可以獲取到服務(wù)器返回的二進(jìn)制數(shù)據(jù)。接著,我們創(chuàng)建一個(gè)a標(biāo)簽,為其設(shè)置下載鏈接和文件名,并將其添加到文檔中。之后,使用a.click()方法觸發(fā)下載,并在下載完成后回收URL資源和移除a標(biāo)簽。
需要注意的是,由于IE瀏覽器對(duì)blob對(duì)象的支持不完整,如果想要在IE中實(shí)現(xiàn)下載功能,需要另外處理。下面是針對(duì)IE的代碼:
$.ajax({ method: "GET", url: "example.php", data: {fileId: "12345"}, xhrFields: { responseType: 'arraybuffer' }, success: function (data) { var blob; if (typeof window.Blob === "function") { blob = new Blob([data], {type: "application/pdf"}); } else { var BlobBuilder = window.BlobBuilder || window.MozBlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder; var bb = new BlobBuilder(); bb.append(data); blob = bb.getBlob("application/pdf"); } window.navigator.msSaveBlob(blob, 'example.pdf'); } });
與前一段代碼類(lèi)似,我們通過(guò)設(shè)置xhrFields的responseType屬性為arraybuffer來(lái)獲取服務(wù)器返回的二進(jìn)制數(shù)據(jù)。之后,我們根據(jù)瀏覽器支持情況,使用Blob對(duì)象創(chuàng)建對(duì)應(yīng)類(lèi)型的二進(jìn)制數(shù)據(jù),并使用window.navigator.msSaveBlob()方法將數(shù)據(jù)保存為文件。