[英]Any fallback client-side solutions for the html5 download attribute?
對於不支持HTML5“下載”屬性的瀏覽器,是否有客戶端備用選項?
目前,只有Chrome才能正確支持此功能。 Firefox有支持,但從一個鈍觀點來看,它應該只針對“安全”問題來自同一域的文件。
處理此問題的正確方法是讓后端服務器使用Content-Disposition標頭代理請求的文件,但在這種情況下,它很可能不是一個選項。
Firefox的“安全影院”也不是很有用,因為它是設置代理的任意機制。
我正在查看https://github.com/dcneiner/Downloadify,但只是意識到它只支持文件創建,而不支持遠程文件訪問。
簡短的回答:沒有。 除了您已經提到的download
屬性之外,沒有干凈的客戶端方法來執行此操作。 發送正確的頭文件是最好的, 但你可能不希望使用黑客:
對於具有download
屬性的所有鏈接(您可以使用document.querySelectorAll('a[download]')
),使用XMLHttpRequest獲取HREF中提到的URL處的頁面/數據。 然后,使用btoa()
函數(或IE的polyfill)將其轉換為base64字符串。 現在將"data:application/octet-stream;base64,"
到字符串的開頭並將其設置為錨點的新HREF屬性,然后刪除download
屬性。 (您可能希望首先探索瀏覽器支持,例如Modernizr )。
我告訴過你,你不喜歡它!
我寫了這個JS [attrDownloadIE.js]
// author: Carlos Machado
// version: 0.1
// year: 2015
//
var f_name = "";
var f_ref = "";
function reqListener() {
if(f_name == "") {f_name = f_ref;}
var blobObject = this.response;
window.navigator.msSaveBlob(blobObject, f_name);
}
function myDownload(evt) {
f_name = this.getAttribute("download");
f_ref = this.getAttribute("href");
evt.preventDefault();
var oReq1 = new XMLHttpRequest();
oReq1.addEventListener("load",reqListener, false);
oReq1.open("get", this, true);
oReq1.responseType = 'blob';
oReq1.send();
}
document.addEventListener(
"load",
function(event){
var isIE = /*@cc_on!@*/false || !!document.documentMode;
if(isIE) {
var items = document.querySelectorAll('a[download], area[download]');
for(var i = 0; i < items.length; i++) {
items[i].addEventListener('click', myDownload, false);
}
}
}
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.