Hiện có một cách để có được quyền đọc và ghi liên tục vào các tệp cũng như thư mục mà không cần phải cấp quyền nhiều lần. Bài đăng này giải thích cách hoạt động. Trước khi đi sâu vào chi tiết, chúng tôi xin tóm lược nhanh hiện trạng và vấn đề đang được giải quyết.
Những thách thức với phương thức hiện tại
File System Access API (API Truy cập hệ thống tệp) cho phép nhà phát triển truy cập vào các tệp trên ổ đĩa cứng cục bộ của người dùng theo cách đọc và ghi (không bắt buộc). Một ứng dụng phổ biến (trong số nhiều ứng dụng khác) sử dụng API này là Visual Studio Code (Mã VS), IDE của Microsoft chạy trực tiếp trong trình duyệt. Khi mở VS Code, bạn sẽ được chào đón bằng màn hình Welcome (Chào mừng), nơi bạn có thể tạo tệp mới hoặc mở tệp hiện có/thư mục.
Nếu bạn nhấp vào Open Folder (Mở thư mục) rồi chọn một trong các thư mục trên ổ đĩa cứng, thì trình duyệt sẽ hỏi xem bạn có muốn VS Code có quyền xem thư mục này hay không.
Sau khi cấp quyền truy cập, bạn có thể điều hướng đến hệ phân cấp thư mục và mở tệp trong trình chỉnh sửa của VS Code. Nếu bạn sửa đổi tệp bất kỳ, trình duyệt sẽ hỏi xem bạn có muốn cấp quyền chỉnh sửa thư mục đó hay không.
Nếu bạn cho phép việc này, thì biểu tượng tệp trong thanh địa chỉ sẽ thay đổi và một mũi tên xuống nhỏ sẽ được thêm vào để cho biết ứng dụng có quyền đọc và ghi. Để thay đổi quyền, hãy nhấp vào biểu tượng rồi nhấp vào Xoá quyền truy cập để ứng dụng không thể chỉnh sửa tệp nữa.
Quyền truy cập kéo dài cho đến khi bạn đóng thẻ cuối cùng của nguồn gốc. Sau đó, nếu bạn đóng ứng dụng rồi mở lại, VS Code loại sẽ cho phép bạn tiếp tục từ nơi bạn đã dừng lại. Khi bạn nhấp vào Open Recent (Mở gần đây), VS Code sẽ cung cấp thư mục đã mở trước đó để mở lại.
Nhưng ngay cả khi trước đó bạn đã cấp quyền ghi cho thư mục này, thì giờ đây bạn vẫn cần cấp lại quyền truy cập. Làm như vậy sẽ nhanh chóng mệt mỏi. Trước khi tìm hiểu sâu hơn về giải pháp, tức là các quyền liên tục cho API Truy cập hệ thống tệp, làm cách nào để VS Code quản lý được để ghi nhớ các thư mục gần đây?
Trong API Truy cập hệ thống tệp, quyền truy cập vào tệp và thư mục được quản lý thông qua các đối tượng FileSystemHandle
: đối tượng FileSystemFileHandle
đối với tệp và đối tượng FileSystemDirectoryHandle
đối với thư mục (thư mục). Cả hai đều có thể được lưu trữ trong IndexedDB và đây chính là chức năng của Mã VS. Bạn có thể thấy điều này bằng cách mở Công cụ nhà phát triển Chrome, trên thẻ Ứng dụng, chuyển đến mục IndexedDB và chọn bảng có liên quan vscode-filehandles-store
trong cơ sở dữ liệu vscode-web-db
.
Cách mới: nội dung thay đổi và thời điểm thay đổi
Chrome sẽ triển khai hành vi mới để cho phép người dùng tuỳ ý cấp quyền truy cập vĩnh viễn vào các tệp và thư mục của họ, giúp họ không cần phải liên tục nhắc lại người dùng.
Hành vi mới có thể được quan sát thấy kể từ Chrome 122. Để kiểm thử sớm hơn, kể từ Chrome 120, hãy chuyển đổi 2 cờ chrome://flags/#file-system-access-persistent-permission
và chrome://flags/#one-time-permission
thành Bật.
Thứ nhất, hành vi mới bao gồm một lời nhắc cấp quyền 3 chiều mới mà người dùng có thể tuỳ ý cấp cho ứng dụng quyền truy cập vào các tệp và thư mục đã chọn trong mỗi lần truy cập.
Lời nhắc 3 chiều mới này có các tuỳ chọn sau:
- Cho phép lần này: Cho phép ứng dụng có quyền truy cập vào các tệp trong phiên hiện tại. (Điều này tương ứng với hành vi hiện tại.)
- Cho phép mỗi lần truy cập: Cho phép ứng dụng có quyền truy cập vô thời hạn, trừ phi bị thu hồi quyền truy cập. Sau khi ứng dụng được cấp quyền truy cập liên tục, bạn cũng có thể truy cập liên tục vào các tệp và thư mục mới mở.
- Không cho phép: Không cho phép ứng dụng có quyền truy cập vào tệp. (Điều này tương ứng với hành vi hiện tại.)
Thứ hai, hành vi mới này sẽ đòi hỏi một mục mới trong chế độ cài đặt trang web. Người dùng có thể truy cập vào một mục mới thông qua biểu tượng khởi chạy bên cạnh nút bật/tắt Chỉnh sửa tệp.
Khi được nhấp vào, biểu tượng khởi chạy này sẽ mở phần cài đặt Quyền riêng tư và bảo mật cho ứng dụng được đề cập. Tại đây, người dùng sẽ thấy danh sách các mục cho mọi tệp và thư mục mà ứng dụng có quyền truy cập. Bạn có thể thu hồi quyền truy cập cho từng mục bằng cách nhấp vào biểu tượng thùng rác. Việc xoá quyền truy cập cho từng mục có nghĩa là ứng dụng vẫn có thể được cấp quyền truy cập vào các tệp nói chung. Để thu hồi quyền truy cập nói chung, người dùng có thể nhấp vào biểu tượng trong thanh địa chỉ, như đã mô tả trước đó.
Cách kích hoạt hành vi mới
API Truy cập hệ thống tệp không có thay đổi nào dành cho nhà phát triển. Để kích hoạt hành vi mới với các quyền liên tục, có 3 cách với các điều kiện tiên quyết khác nhau cần được đáp ứng:
- Người dùng phải cấp quyền cho một tệp hoặc thư mục (hoặc nhiều tệp hoặc thư mục) trong lần truy cập gần đây nhất vào một nguồn gốc và ứng dụng đó phải lưu trữ các đối tượng
FileSystemHandle
tương ứng trong IndexedDB. Trong lần truy cập tiếp theo đến nguồn gốc, ứng dụng phải truy xuất một trong những đối tượngFileSystemHandle
đã lưu trữ từ IndexedDB và sau đó gọi phương thứcFileSystemHandle.requestPermission()
. Nếu các điều kiện tiên quyết này được đáp ứng, lời nhắc 3 chiều mới sẽ hiển thị. - Nguồn gốc phải gọi phương thức
FileSystemHandle.requestPermission()
trênFileSystemHandle
đã được cấp quyền truy cập trước đó, nhưng quyền truy cập của tệp này đã tự động bị thu hồi do thẻ đã được chạy ở chế độ nền trong một thời gian. (Tính năng tự động thu hồi quyền hoạt động dựa trên cùng một logic như mô tả trong bài viết Quyền một lần trong Chrome.) Nếu đáp ứng những điều kiện tiên quyết này, lời nhắc 3 chiều mới sẽ hiển thị. - Người dùng phải cài đặt ứng dụng. Các ứng dụng đã cài đặt sẽ tự động duy trì quyền sau khi người dùng cấp quyền truy cập. Trong trường hợp này, lời nhắc 3 chiều sẽ không xuất hiện mà thay vào đó, ứng dụng sẽ nhận được hành vi mới theo mặc định.
Trong trường hợp đầu tiên và thứ hai, lời nhắc liệt kê tất cả các đối tượng FileSystemHandle
mà ứng dụng có quyền truy cập trước đó, chứ không chỉ đối tượng mà phương thức requestPermission()
đang được gọi. Căn chỉnh với cách hoạt động của yêu cầu cấp quyền một lần, nếu người dùng từ chối hoặc đóng lời nhắc nhiều hơn 3 lần, thì lời nhắc cấp quyền thông thường sẽ không còn kích hoạt nữa. Thay vào đó, lời nhắc cấp quyền thông thường sẽ xuất hiện.
Thử hành vi mới
Nếu có một phiên bản hỗ trợ của Chrome hoặc đã đặt các cờ bắt buộc, bạn có thể kiểm thử hành vi mới trong Mã VS trên web. Mở một thư mục và cấp quyền truy cập, sau đó đóng thẻ rồi mở lại rồi nhấp vào Mở gần đây (lưu ý rằng việc tải lại ngay lập tức không hoạt động khi kích hoạt lời nhắc, bạn cần phải đóng tất cả các thẻ). Chọn thư mục trước đó, lời nhắc mới sẽ xuất hiện. Để tìm hiểu trường hợp kiểm thử đơn giản hơn, hãy xem bản minh hoạ Quyền truy cập vào hệ thống tệp liên tục và xem mã nguồn của trường hợp này.
Kết luận
Quyền lâu dài cho API Truy cập hệ thống tệp là một trong những tính năng được yêu cầu nhiều nhất của API và lỗi triển khai cũng rất phổ biến, với nhiều nhà phát triển gắn dấu sao nó. Bằng việc cung cấp tính năng này cho các nhà phát triển và trên hết là đến tay người dùng, chúng tôi hiện đã thu hẹp khoảng cách quan trọng về tính năng so với các ứng dụng dành riêng cho nền tảng.
Thư cảm ơn
Bài đăng này đã được ChristineHollingsward, AustinSullivan và Rachel Andrew xem xét.