簡體   English   中英

html5下載屬性的任何后備客戶端解決方案?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM