Skip to main content
downloads API 打造一個小型下載管理器。background script 開始與取消下載,popup 列出即時進度。

你會做出什麼

Manifest

manifest.json

開始與取消下載

filename 相對於瀏覽器的下載目錄。允許子資料夾,不允許絕對路徑與 .. 片段。
background.js
這個 API 還提供 pauseresumeerase,可以做出完整的管理器行為。

在 popup 顯示進度

onChanged 會在狀態轉換時觸發,但不會串流位元組數。輪詢 search() 取得進行中的項目,並從結果讀取 bytesReceivedtotalBytes
popup.html
popup.js

擴充功能可以平行下載嗎?

網路佇列由瀏覽器擁有,擴充功能無法改變這一點。Chromium 本來就會同時執行多個下載,但會限制每台伺服器的並行連線數,其餘則排入佇列。擴充功能無法提高這些限制,也無法像下載加速器那樣把一個檔案切成多段。 擴充功能能做的是編排:用多個 download() 呼叫開始一批下載,監看 onChanged,並在一個完成時開始下一個。這給你一個帶進度的有序佇列,而這正是多數「平行下載」需求真正想要的。

執行

從 background 主控台觸發一個下載,然後開啟 popup 觀看進度。

Firefox 注意事項

  • Firefox 以 browser.downloads 搭配 promise 支援相同的 API,chrome.downloads 別名也可運作。
  • Firefox 不支援 chrome.downloads.setUiOptions,這個 API 用來隱藏 Chrome 的下載 UI。
  • onChanged 的 delta 形狀與 search() 的查詢形狀在兩個瀏覽器上一致。
共通的 API 面請參考 跨瀏覽器相容性

從範本開始

action 範本附帶這份教學使用的 background 加工具列 popup 版面。
儲存庫:extension-js/examples/action

最佳實務

  • 把檔名都放在同一個資料夾下,讓使用者能找到你的檔案。
  • 沒有進行中的下載時,停止 setInterval 輪詢。
  • 處理 interrupted 狀態,並把 item.error 呈現給使用者。
  • 只在使用者明確要求的檔案上保持 saveAs: false
  • erase 清理歷史紀錄項目,而不是刪除檔案。

後續步驟