2010-01-28 121 views

回答

27

您可以使用HTML5 FileSystem features使用Download API寫入到磁盤。這是將文件下載到磁盤的唯一方式,且受到限制。

你可以看看NPAPI插件。另一種做你需要的方法是簡單地通過XHR POST向外部網站發送請求,然後通過另一個GET請求來檢索返回的文件,這將顯示爲保存文件對話框。

例如,對於我的瀏覽器擴展My Hangouts我創建了一個實用程序直接下載從HTML5畫布照片到磁盤。你可以看看這裏的代碼capture_gallery_downloader.js,做這是代碼:

var url = window.webkitURL || window.URL || window.mozURL || window.msURL; 
var a = document.createElement('a'); 
a.download = 'MyHangouts-MomentCapture.jpg'; 
a.href = url.createObjectURL(dataURIToBlob(data.active, 'jpg')); 
a.textContent = 'Click here to download!'; 
a.dataset.downloadurl = ['jpg', a.download, a.href].join(':'); 

如果你想轉換一個URI到HTML5的Blob執行這裏是我是如何做的:

/** 
* Converts the Data Image URI to a Blob. 
* 
* @param {string} dataURI base64 data image URI. 
* @param {string} mimetype the image mimetype. 
*/ 
var dataURIToBlob = function(dataURI, mimetype) { 
    var BASE64_MARKER = ';base64,'; 
    var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; 
    var base64 = dataURI.substring(base64Index); 
    var raw = window.atob(base64); 
    var rawLength = raw.length; 
    var uInt8Array = new Uint8Array(rawLength); 

    for (var i = 0; i < rawLength; ++i) { 
    uInt8Array[i] = raw.charCodeAt(i); 
    } 

    var bb = new this.BlobBuilder(); 
    bb.append(uInt8Array.buffer); 
    return bb.getBlob(mimetype); 
}; 

然後在用戶點擊下載按鈕後,它將使用「下載」HTML5 File API將BLOB URI下載到文件中。

+0

這不是我們第一次將我重定向到NPAPI。我會看看它。感謝您的幫助 – 2010-01-29 07:31:23

+5

請注意,如果您打算將擴展程序上傳到Google的畫廊,那麼使用NPAPI將會延遲發佈,以便他們進行長時間審閱,甚至可能無法接受。 – 2010-01-29 07:37:04

+0

我同意Max。它會延遲發佈,因爲它將被手動審查。如果您有一臺外部服務器,您可以在擴展程序中授予訪問權限,並通過POST上傳數據,並通過具有適當標頭的GET取回數據,那將是最好的選擇。 – 2010-01-30 23:50:08

-2

由於Javascript搭便車連接到您的計算機的網頁從任何地方,讓它有能力寫入到您的磁盤是危險的。

這是不允許的。您是否認爲Chrome擴展程序需要用戶互動?否則它可能屬於同一類別。

5

有沒有辦法,我知道的默默的文件保存到用戶的驅動器,這是它看起來像你希望做的事。我想,你可以要求文件的同時要保存一個使用類似(提示用戶每次):

function saveAsMe (filename) 
{ 
document.execCommand('SaveAs',null,filename) 
} 

如果你想僅提示用戶一次,你可以靜靜地抓住所有的圖像,將它們壓縮成一個包,然後讓用戶下載它。這可能意味着在所有文件上執行XmlHttpRequest,在Javascript中壓縮它們,將它們上傳到暫存區域,然後詢問用戶是否想下載zip文件。聽起來很荒唐,我知道。

有在瀏覽器本地存儲選項,但他們只對開發者的使用,在沙箱中,據我所知。 (例如Gmail離線緩存)。請參閱Google最近的公告,如this one

+12

只適用於互聯網瀏覽器 – 2011-01-30 20:20:31

3

Google Webstore
Github

我做了,做這樣的事情,如果有人在這裏仍有意擴展。 它使用XMLHTTPRequest獲取對象,在這種情況下,該對象被假定爲圖像,然後創建一個ObjectURL對象,指向該對象的鏈接,然後單擊想象的鏈接。

+0

拉斯普京?尼斯... – chb 2012-08-10 04:31:53

+0

第一個鏈接命中404 – therealprashant 2017-08-21 05:56:54

18

我一直希望爲自己製作一個擴展程序來批量下載圖像。然而,每次我都感到沮喪,因爲唯一看似適用的選擇是NPAPI,而鉻和Firefox似乎都不再需要支持。

我建議那些仍然希望實現'保存文件磁盤'功能的人看看這個Stackoverflow post,這篇文章下面的評論幫了我很多。

現在自鉻31+,chrome.downloads API變得穩定。我們可以使用它來以編程方式下載文件。如果用戶未在chrome設置中設置ask me before every download高級選項,我們可以保存文件而不會提示用戶確認!

這裏是我使用(在擴展的背景頁):

// remember to add "permissions": ["downloads"] to manifest.json 
    // this snippet is inside a onMessage() listener function 
    var imgurl = "https://www.google.com.hk/images/srpr/logo11w.png"; 
    chrome.downloads.download({url:imgurl},function(downloadId){ 
     console.log("download begin, the downId is:" + downloadId); 
    }); 

雖然它是Chrome仍然會在下載完成時不提供Event可惜。當下載begin成功(沒有完成)chrome.downloads.download的回調函數被調用

官方文檔大約chrome.downloadshere

這不是我最初的想法,但我在這裏張貼希望它可能對某人有用。

+1

不知道2014年,但到今天爲止,有可能聽到'onChanged'事件,該事件帶有可以告訴下載狀態的狀態對象(例如「完成」 )。 – JSmyth 2016-04-18 21:38:57

+1

@Allan,Re「*我們可以保存文件而不會提示用戶確認*」;但是當你開始將文件寫入用戶的機器時,不會打開底部的「下載欄」?有沒有什麼辦法可以靜靜地做到這一點? (例如,如果您在後臺向用戶機器寫入50個文件) – Pacerier 2016-08-18 11:24:38

+0

@Pacerier它是調用下載架,當我編寫答案時,我記得我必須手動禁用在高級選項頁面中顯示的架子。我做了一些搜索,我發現這個:你可能很有趣.'setShelfEnabled' 'chrome.downloads.setShelfEnabled(boolean enabled)' 啓用或禁用與當前瀏覽器配置文件關聯的每個窗口底部的灰色格架。只要至少有一個分機禁用了分機,該分機就會被禁用。在至少有一個其他擴展禁用的情況下啓用機箱時,它將通過runtime.lastError返回錯誤。 – 2016-08-18 12:00:35