2015-11-20 153 views
0

我嘗試重命名下載屬性文件,但它不工作。文件下載重命名工作不

<a href="https://jsfiddle.net/img/logo.png" download="something.png">OK</a> 

FIDDLE

+0

什麼是你想.append什麼? –

+0

問題不在追加。 – Youssef

+0

好的,您希望下載/重命名的文件類型是什麼? –

回答

5

只如果該文件是在同一個原點,所以如果你可以下載一個外部文件與CORS +阿賈克斯,那麼你可以保存BLOB使用自定義名稱

$('a').click(function(evt){ 
 
    evt.preventDefault(); 
 
    var name = this.download; 
 
    
 
    // we need a blob so we can create a objectURL and use it on a link element 
 
    // jQuery don't support responseType = 'blob' (yet) 
 
    // So I use the next version of ajax only avalible in blink & firefox 
 
    // it also works fine by using XMLHttpRequest v2 and set the responseType 
 
    fetch("https://crossorigin.me/" + this.href) 
 
     // res is the beginning of a request it only gets the response headers 
 
     // here you can use .blob() .text() .json or res.arrayBuffer() depending 
 
     // on what you need, if it contains Content-Type: application/json 
 
     // then you might want to choose res.json() 
 
     // all this returns a promise 
 
     .then(res => res.blob()) 
 
     .then(blob => { 
 
      $("<a>").attr({ 
 
       download: name, 
 
       href: URL.createObjectURL(blob) 
 
      })[0].click(); 
 
     }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<a href="https://jsfiddle.net/img/logo.png" download="something.png">OK</a>

工作
+0

它的工作原理,但它花了一點時間,我將離開使用像'crossorigin.me'的CORS代理作爲最終選擇。 – Youssef

+0

我使用'fetch(「https://crossorigin.me/」+ this.href)'而不是'https:// crossorigin.me /'就像這個'fetch(this.href)'一樣,它可以解釋我爲什麼? – Youssef

+0

我剛剛添加了crossorigin.me cuz我不​​知道你試圖獲取的資源是否已啓用CORS ..所以這個文件可能已經有了Access-Control-Allow-Origin:*響應頭文件 – Endless

5

從你鏈接的文檔:

如果HTTP標頭內容處置:是存在,並給出了不同的文件名比這個屬性,HTTP標頭的優先級高於此屬性。

我的猜測是您要鏈接的服務器設置此標頭。

此外,如果你要鏈接到外部資源很可能將無法正常工作:

此屬性僅授予具有相同來源的資源鏈接。

+0

如果'Content-Disposition'存在,如何覆蓋優先級?因爲我認爲這是我的問題,因爲與資源的鏈接是同源的。 – Youssef

0

看來,這個屬性不爲外部文件繼續工作時,由於可能的安全問題。

你可以找到關於這個問題的討論爲Chrome here

使用「下載」屬性將始終觸發下載,而是從M-35 起將只兌現如果最終建議的文件名資源URL與文檔相同。即使沒有,只要MIME類型正確指定它,它就會收到這樣的文件名「下載」。主機操作系統已知的擴展名爲映射到指定的MIME類型的擴展名。如果資源通過Content-Disposition提供,則Content-Disposition將優先。

而對於Firefox的herehere