downloads API 打造一個小型下載管理器。background script 開始與取消下載,popup 列出即時進度。
你會做出什麼
Manifest
manifest.json
開始與取消下載
filename 相對於瀏覽器的下載目錄。允許子資料夾,不允許絕對路徑與 .. 片段。
background.js
pause、resume 與 erase,可以做出完整的管理器行為。
在 popup 顯示進度
onChanged 會在狀態轉換時觸發,但不會串流位元組數。輪詢 search() 取得進行中的項目,並從結果讀取 bytesReceived 與 totalBytes。
popup.html
popup.js
擴充功能可以平行下載嗎?
網路佇列由瀏覽器擁有,擴充功能無法改變這一點。Chromium 本來就會同時執行多個下載,但會限制每台伺服器的並行連線數,其餘則排入佇列。擴充功能無法提高這些限制,也無法像下載加速器那樣把一個檔案切成多段。 擴充功能能做的是編排:用多個download() 呼叫開始一批下載,監看 onChanged,並在一個完成時開始下一個。這給你一個帶進度的有序佇列,而這正是多數「平行下載」需求真正想要的。
執行
Firefox 注意事項
- Firefox 以
browser.downloads搭配 promise 支援相同的 API,chrome.downloads別名也可運作。 - Firefox 不支援
chrome.downloads.setUiOptions,這個 API 用來隱藏 Chrome 的下載 UI。 onChanged的 delta 形狀與search()的查詢形狀在兩個瀏覽器上一致。
從範本開始
action 範本附帶這份教學使用的 background 加工具列 popup 版面。
最佳實務
- 把檔名都放在同一個資料夾下,讓使用者能找到你的檔案。
- 沒有進行中的下載時,停止
setInterval輪詢。 - 處理
interrupted狀態,並把item.error呈現給使用者。 - 只在使用者明確要求的檔案上保持
saveAs: false。 - 用
erase清理歷史紀錄項目,而不是刪除檔案。

