使用chrome.downloads API以編程方式開始下載,監視,操縱,搜索下載的文件。
{
"name": "My extension",
...
"permissions": [
"downloads"
],
...
}
DownloadItem,代表下載項目任務的一個型別,此物件實例中包含非常多的屬性,以下只羅列其中一部份,幫助大家了解這個物件大概會有什麼資訊:
chrome.downloads.download(object options, function callback)
object options 參數設定下載檔案的相關資訊,包含以下資訊:
使用說明
如果下載成功開始,將調用回調
,並傳遞新的DownloadItem的downloadId。(注意不是直接回傳下載項目)如果開始下載時發生了錯誤,將調用回調
,並傳遞downloadId:undefined,並且runtime.lastError包含描述性文字 。範例:
var downloadOptions = {
"url" : "http://www.apress.com/downloadable/download/sample/sample_id/1456/",
"saveAs" : true
};
chrome.downloads.download(downloadOptions,function(downloadId) {
console.log(downloadId);
});
這裡使用的是電子書中的範例,完整的範例參考第三章節DownloadsAPI
一旦你取得下載項目的ID,你可以經由ID作以下操作:
chrome.downloads.cancel(integer downloadId, function callback)
如果復原失敗則runtime.lastError將包含錯誤訊息,如果下載項目不處於有用狀態,則下載會失敗。
chrome.downloads.resume(integer downloadId, function callback)
chrome.downloads.pause(integer downloadId, function callback)
一旦檔案下載完成,你就能使用下載項目的ID來打開檔案,如果下載還沒完成,經 runtime.lastError在回調中通知錯誤。
注意該方法在安裝檔中需要額外設定downloads.open
權限,項目第一次打開時會觸發onChanged事件。
chrome.downloads.open(integer downloadId)
如果你想打開的是下載檔案的目錄,則提供以下兩個操作:
chrome.downloads.show(integer downloadId)
`crome.downloads.showDefaultFolder()`
如果指定的下載項目還未完成,經 runtime.lastError在回調中通知錯誤。
chrome.downloads.removeFile(integer downloadId, function callback)
只刪除紀錄,而不刪除檔案。每刪除一個檔案,獨立觸發一次 onErased事件,才執行callback。
chrome.downloads.erase(object query, function callback)
可以使用參數query來設定要刪除檔案的條件,符合調件的紀錄會進行批次刪除。例如,可以設定 紀錄的下載時間,有些查詢的屬性非常有用:例如:startedBefore、startedAfter(開始的時間區間)、 endedBefore、 endedAfter(結束的時間區間)、filenameRegex(檔案名稱的正規表達式)、and urlRegex(下載網址的正規表達式),完整的query設定可以參考官網文件。
chrome.downloads.resume(downloadId,function() {
if(!chrome.runtime.lastError) console.log("pause");
});
chrome.downloads.onDeterminingFilename.addListener(function callback)
在確定檔案文件的過程中,擴充功能有機會修改目標的文件名稱。每一個擴充功能只能設定一個此監聽器。
事件觸發的回調中,必需提供一個 suggest()
方法,開發人員需用此方法設置建議的檔名及預設的儲存動作(覆蓋舊文件/系統自動命名/提示選擇對話框)。
預設的儲存動作的列舉
"uniquify", "overwrite", or "prompt"
suggest()
方法如果要異步調用,則需在事件的回調中回傳true,否則監聽器會自動調用suggest()
方法。suggest()
前,下載事件不會完成。suggest()
則使用下載時設定的downloadItem.filename
作為文件名。suggest()
傳遞設置的擴充功能優先,為避免混肴,使用者不該同時安裝多個有服務的擴充功能。示範:在所有檔案下載完成後,使用腳本覆蓋預設檔名。
chrome.downloads.onDeterminingFilename.addListener(function(item, suggest) {
suggest({
filename: item.filename + "羅拉拉的下載",
conflictAction: 'overwrite',
conflict_action: 'overwrite'
});
});
注意:
實測時發現conflictAction的設定在我的電腦沒有效果,每次都會詢問我是否覆蓋文件,初步猜想可能跟 設定>進階設定>的「下載每個檔案前先詢問儲存位置」設定有關,但即使我把勾勾取消,他還是不停的跳出儲存位置的詢問,今天時間不太夠,我後面有時間會去查証。
還有一些其他操作,例如:搜尋下載、取得檔案的ICON、提示用戶這是有風險的下載、將已下載的檔案拖動到另一個應用程序中、啟用或禁用位顧瀏覽器下源的灰色下載框等,完整的清單請參考官網文件。
試用下載API我們能實作以下功能:
suggest()
方法即使設定了儲存動作,在我的電腦也沒有作用,我查詢了官網的範例以及開發人員的討論串,目前還沒找到解法。而電子書的作者是直接略過了這個API沒說。