您現在可以透過某種方式,取得檔案和資料夾的持續性讀取和寫入權限,而無須重複授予權限。本文將說明這項功能的運作方式。在深入探討細節之前,讓我們快速回顧現況和要解決的問題。
目前方法的挑戰
File System Access API 可讓開發人員以讀取和 (選用) 寫入的方式存取使用者本機硬碟上的檔案。其他許多熱門應用程式也使用這個 API,其中包括 Visual Studio Code (VS Code),這是 Microsoft 的 IDE,可直接在瀏覽器中執行。開啟 VS Code 時,您會看到「歡迎」畫面,可用於建立新檔案,或開啟現有檔案或資料夾。
如果您點選「Open Folder」並選擇硬碟上的其中一個資料夾,瀏覽器會詢問您是否要讓 VS Code 查看這個資料夾。
授予存取權後,您就能在 VS Code 編輯器中瀏覽資料夾階層並開啟檔案。如要修改任何檔案,瀏覽器會詢問您是否要授予資料夾的編輯權限。
如果允許這項權限,網址列中的檔案圖示會變更,並新增一個小箭頭,表示應用程式已取得讀取和寫入權限。如要變更權限,請按一下圖示,然後點選「移除存取權」,讓應用程式無法再編輯檔案。
直到您關閉來源網頁的最後一個分頁為止。如果您關閉應用程式再重新開啟,VS Code 會讓您繼續先前的作業。點選「Open Recent」時,VS Code 會提供先前開啟的資料夾,讓您重新開啟。
不過,即使您先前已授予資料夾的寫入權限,現在仍需再次授予存取權。這麼做很快就會累垮。在深入探討解決方案 (也就是 File System Access API 的持續性權限) 之前,我們先來瞭解 VS Code 如何管理記住最近使用的資料夾。
在 File System Access API 中,檔案和資料夾的存取權會透過 FileSystemHandle
物件管理:檔案的 FileSystemFileHandle
物件,以及資料夾 (目錄) 的 FileSystemDirectoryHandle
物件。這兩者都可以儲存在 IndexedDB 中,而這正是 VS Code 所做的。如要查看這項資訊,請開啟 Chrome 開發人員工具,在「Application」分頁中前往「IndexedDB」專區,然後選取 vscode-web-db
資料庫中的相關資料表 vscode-filehandles-store
。
新方法:變更內容和時間
Chrome 推出了新的行為,讓使用者可選擇授予檔案和資料夾的永久存取權,避免需要不斷重新提示使用者。這項新功能可在 Chrome 122 以上版本中觀察到。如要提早測試,請從 Chrome 120 開始,將兩個標記 chrome://flags/#file-system-access-persistent-permission
和 chrome://flags/#one-time-permission
切換為「已啟用」。
首先,新行為包含新的三向權限提示,可讓使用者在每次造訪時選擇授予應用程式對所選檔案和資料夾的存取權。
這個新的三向提示包含下列選項:
- 允許這次:允許應用程式存取目前工作階段的檔案。(這與現有行為相符)。
- 每次造訪都允許:允許應用程式無限期存取,除非您撤銷存取權。應用程式獲得永久存取權後,新開啟的檔案和資料夾也能永久存取。
- 不允許:不允許應用程式存取檔案。(這與現有行為相符)。
其次,新行為會在網站設定中加入新專區,使用者可以透過「檔案編輯」切換鈕旁的啟動圖示存取該專區。
點選這個啟動圖示後,系統會為相關應用程式開啟「隱私權和安全性」設定,使用者可在該頁面查看應用程式可存取的所有檔案和資料夾項目清單。您可以按一下垃圾桶圖示,針對個別項目撤銷存取權。移除個別項目的存取權,表示應用程式仍可獲得一般檔案存取權。如要撤銷存取權,使用者可以按一下網址列中的圖示,如先前所述。
如何觸發新行為
File System Access API 沒有任何面向開發人員的變更。如要觸發具有持續性權限的新行為,有三種方式,但需要符合不同的前置條件:
- 使用者必須在上次造訪來源時授予檔案或資料夾 (或多個檔案或資料夾) 的權限,且應用程式必須已在 IndexedDB 中儲存對應的
FileSystemHandle
物件。下次造訪來源時,應用程式必須從 IndexedDB 擷取任何已儲存的FileSystemHandle
物件,然後呼叫其FileSystemHandle.requestPermission()
方法。如果符合這些先決條件,系統就會顯示新的三向提示。 - 來源必須在先前已授予存取權的
FileSystemHandle
上呼叫FileSystemHandle.requestPermission()
方法,但由於分頁已在背景運作一段時間,因此該來源的存取權已自動撤銷。(自動權限撤銷功能的運作方式與「Chrome 中的一次性權限」一文所述的邏輯相同)。如果符合這些先決條件,系統就會顯示新的三向提示。 - 使用者必須已安裝應用程式。一旦使用者授予存取權,已安裝的應用程式就會自動保留權限。在這種情況下,系統不會顯示三方提示,而是預設會讓應用程式取得新行為。
在第一種和第二種情況下,提示會列出應用程式先前有權存取的所有 FileSystemHandle
物件,而非僅列出 requestPermission()
方法所呼叫的物件。與一次性權限的運作方式相同,如果使用者拒絕或關閉提示超過三次,系統就不會再觸發提示,而是會顯示一般權限提示。
試用新行為
如果您使用的是支援的 Chrome 版本,或是已設定必要的標記,您可以在網頁上使用 VS Code 測試新的行為。開啟資料夾並授予存取權,然後關閉分頁並重新開啟,再按一下「開啟最近的」 (請注意,立即重新載入無法觸發提示,必須關閉所有分頁)。選擇先前的資料夾,系統就會顯示新的提示訊息。如要進一步縮減測試案例,請查看 Persistent File System Access 示範,並查看其原始碼。
結論
檔案系統存取 API 的持續性權限是 API 最受歡迎的功能之一,而實作錯誤也非常受歡迎,許多開發人員都將其設為主題。這項功能現在已開放給開發人員,更重要的是,也開放給使用者,因此與特定平台應用程式相比,這項功能的差距已縮小。
特別銘謝
這篇文章由 Christine Hollingsworth、Austin Sullivan 和 Rachel Andrew 審查。