Đăng ký một ứng dụng làm trình xử lý tệp với hệ điều hành.
Giờ đây, các ứng dụng web có thể đọc và ghi tệp, bước tiếp theo theo logic là cho phép nhà phát triển khai báo các ứng dụng web này làm trình xử lý tệp cho các tệp mà ứng dụng của họ có thể tạo và xử lý. API Xử lý tệp cho phép bạn làm chính việc này. Sau khi đăng ký một ứng dụng trình chỉnh sửa văn bản làm trình xử lý tệp và sau khi cài đặt ứng dụng đó, bạn có thể nhấp chuột phải vào tệp .txt
trên macOS rồi chọn "Get Info" (Lấy thông tin) để hướng dẫn hệ điều hành luôn mở các tệp .txt
bằng ứng dụng này theo mặc định.
Các trường hợp sử dụng được đề xuất cho API Xử lý tệp
Ví dụ về các trang web có thể sử dụng API này bao gồm:
- Các ứng dụng văn phòng như trình chỉnh sửa văn bản, ứng dụng bảng tính và trình tạo bản trình bày.
- Trình chỉnh sửa đồ hoạ và công cụ vẽ.
- Công cụ chỉnh sửa cấp độ trò chơi điện tử.
Cách sử dụng API Xử lý tệp
Cải tiến tăng dần
Mỗi API Xử lý tệp không thể được điền bằng polyfill. Tuy nhiên, có thể thực hiện chức năng mở tệp bằng ứng dụng web thông qua 2 cách khác:
- Web Share Target API (API Mục tiêu chia sẻ trên web) cho phép nhà phát triển chỉ định ứng dụng của họ làm mục tiêu chia sẻ để có thể mở tệp từ trang chia sẻ của hệ điều hành.
- Bạn có thể tích hợp File System Access API (API Truy cập hệ thống tệp) với tính năng kéo và thả tệp để nhà phát triển có thể xử lý các tệp đã thả trong ứng dụng đã mở.
Hỗ trợ trình duyệt
Phát hiện tính năng
Để kiểm tra xem API Xử lý tệp có được hỗ trợ hay không, hãy sử dụng:
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
// The File Handling API is supported.
}
Phần khai báo của API Xử lý tệp
Trước tiên, ứng dụng web cần mô tả rõ ràng trong tệp kê khai ứng dụng web loại tệp mà ứng dụng có thể xử lý. API Xử lý tệp mở rộng tệp kê khai ứng dụng web bằng một thuộc tính mới có tên là "file_handlers"
. Thuộc tính này chấp nhận một mảng trình xử lý tệp. Trình xử lý tệp là một đối tượng có các thuộc tính sau:
- Thuộc tính
"action"
trỏ đến một URL trong phạm vi ứng dụng làm giá trị. - Thuộc tính
"accept"
có đối tượng là loại MIME làm khoá và danh sách các đuôi tệp làm giá trị. - Thuộc tính
"icons"
có một mảng biểu tượngImageResource
. Một số hệ điều hành cho phép liên kết loại tệp hiển thị một biểu tượng không chỉ là biểu tượng ứng dụng liên kết mà còn là một biểu tượng đặc biệt liên quan đến việc sử dụng loại tệp đó với ứng dụng. - Thuộc tính
"launch_type"
xác định xem có nên mở nhiều tệp trong một ứng dụng hay trong nhiều ứng dụng. Giá trị mặc định là"single-client"
. Nếu người dùng mở nhiều tệp và nếu trình xử lý tệp đã được chú thích bằng"multiple-clients"
làm"launch_type"
, thì sẽ có nhiều lần khởi chạy ứng dụng và đối với mỗi lần khởi chạy, mảngLaunchParams.files
(xem phần bên dưới) sẽ chỉ có một phần tử.
Ví dụ bên dưới chỉ cho thấy đoạn trích có liên quan của tệp kê khai ứng dụng web sẽ giúp bạn hiểu rõ hơn:
{
"file_handlers": [
{
"action": "/open-csv",
"accept": {
"text/csv": [".csv"]
},
"icons": [
{
"src": "csv-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "single-client"
},
{
"action": "/open-svg",
"accept": {
"image/svg+xml": ".svg"
},
"icons": [
{
"src": "svg-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "single-client"
},
{
"action": "/open-graf",
"accept": {
"application/vnd.grafr.graph": [".grafr", ".graf"],
"application/vnd.alternative-graph-app.graph": ".graph"
},
"icons": [
{
"src": "graf-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "multiple-clients"
}
]
}
Đây là một ứng dụng giả định xử lý các tệp có giá trị được phân tách bằng dấu phẩy (.csv
) tại /open-csv
, tệp đồ hoạ vectơ có thể mở rộng (.svg
) ở /open-svg
và định dạng tệp Grafr được tạo sẵn với bất kỳ .grafr
, .graf
hoặc .graph
là phần mở rộng tại /open-graf
. Hai cửa sổ đầu tiên sẽ mở trong một ứng dụng, cửa sổ cuối cùng sẽ mở trong nhiều ứng dụng nếu nhiều tệp đang được xử lý.
Phần bắt buộc của API Xử lý tệp
Giờ đây, khi đã khai báo về những tệp mà ứng dụng có thể xử lý và URL trong phạm vi về mặt lý thuyết, ứng dụng bắt buộc phải làm gì đó với các tệp gửi đến trong thực tế. Đây là lúc launchQueue
phát huy tác dụng. Để truy cập vào các tệp đã chạy, trang web cần chỉ định đối tượng sử dụng cho đối tượng window.launchQueue
. Các lần khởi chạy được đưa vào hàng đợi cho đến khi được thực thể tiêu thụ chỉ định xử lý và được gọi chính xác một lần cho mỗi lần khởi chạy. Bằng cách này, mọi lần khởi chạy đều được xử lý, bất kể thời điểm người dùng được chỉ định.
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
launchQueue.setConsumer((launchParams) => {
// Nothing to do when the queue is empty.
if (!launchParams.files.length) {
return;
}
for (const fileHandle of launchParams.files) {
// Handle the file.
}
});
}
Hỗ trợ Công cụ cho nhà phát triển
Không có sự hỗ trợ nào cho Công cụ cho nhà phát triển tại thời điểm viết bài này, nhưng tôi đã gửi yêu cầu về tính năng để được hỗ trợ thêm.
Bản minh hoạ
Tôi đã thêm tính năng hỗ trợ xử lý tệp vào Excalidraw, một ứng dụng vẽ theo kiểu hoạt hình. Để kiểm thử ứng dụng này, trước tiên, bạn cần cài đặt Excalidraw. Sau đó, khi tạo một tệp bằng tệp này và lưu trữ ở đâu đó trong hệ thống tệp, bạn có thể mở tệp bằng cách nhấp đúp hoặc nhấp chuột phải rồi chọn "Excalidraw" trong trình đơn theo bối cảnh. Bạn có thể xem cách triển khai trong mã nguồn.
Bảo mật
Nhóm Chrome đã thiết kế và triển khai API Xử lý tệp theo các nguyên tắc cốt lõi được xác định trong Kiểm soát quyền truy cập vào các tính năng mạnh mẽ của nền tảng web, bao gồm cả quyền kiểm soát của người dùng, tính minh bạch và công thái học.
Quyền, quyền ổn định và cập nhật trình xử lý tệp
Để đảm bảo người dùng tin tưởng và sự an toàn của tệp của người dùng, khi API Xử lý tệp mở một tệp, một lời nhắc cấp quyền sẽ xuất hiện trước khi PWA có thể xem tệp. Lời nhắc cấp quyền này sẽ xuất hiện ngay sau khi người dùng chọn PWA để mở tệp, để quyền được kết hợp chặt chẽ với hành động mở tệp bằng PWA, giúp ứng dụng dễ hiểu và phù hợp hơn.
Quyền này sẽ luôn xuất hiện cho đến khi người dùng nhấp vào Cho phép hoặc Chặn xử lý tệp cho trang web hoặc bỏ qua lời nhắc 3 lần (sau đó Chromium sẽ cấm và chặn quyền này). Chế độ cài đặt đã chọn sẽ vẫn tồn tại khi đóng và mở lại PWA.
Khi tệp kê khai cập nhật và thay đổi trong phần "file_handlers"
, các quyền sẽ được đặt lại.
Các vấn đề liên quan đến tệp
Có một danh mục lớn các vectơ tấn công được mở bằng cách cho phép các trang web truy cập vào tệp. Những điều này được nêu trong bài viết về API Truy cập hệ thống tệp. Chức năng liên quan đến bảo mật bổ sung mà API Xử lý tệp cung cấp so với API Truy cập hệ thống tệp là khả năng cấp quyền truy cập vào một số tệp thông qua giao diện người dùng tích hợp của hệ điều hành, thay vì thông qua bộ chọn tệp do ứng dụng web hiển thị.
Vẫn có nguy cơ người dùng có thể vô tình cấp cho một ứng dụng web quyền truy cập vào một tệp bằng cách mở tệp đó. Tuy nhiên, thông thường, việc mở tệp cho phép ứng dụng mở tệp đó đọc và/hoặc thao tác với tệp đó. Do đó, lựa chọn rõ ràng của người dùng để mở một tệp trong một ứng dụng đã cài đặt, chẳng hạn như thông qua trình đơn theo bối cảnh "Mở bằng…", có thể được coi là tín hiệu đủ tin cậy đối với ứng dụng.
Thử thách về trình xử lý mặc định
Trường hợp ngoại lệ là khi không có ứng dụng nào trên hệ thống lưu trữ cho một loại tệp nhất định. Trong trường hợp này, một số hệ điều hành lưu trữ có thể tự động quảng bá trình xử lý mới đăng ký thành trình xử lý mặc định cho loại tệp đó mà không cần người dùng can thiệp. Điều này có nghĩa là nếu người dùng nhấp đúp vào một tệp thuộc loại đó, tệp đó sẽ tự động mở trong ứng dụng web đã đăng ký. Trên các hệ điều hành lưu trữ như vậy, khi tác nhân người dùng xác định rằng không có trình xử lý mặc định hiện có cho loại tệp, thì có thể cần phải có lời nhắc cấp quyền rõ ràng để tránh vô tình gửi nội dung của tệp đến một ứng dụng web mà không có sự đồng ý của người dùng.
Quyền kiểm soát của người dùng
Quy cách này nêu rõ rằng trình duyệt không được đăng ký mọi trang web có thể xử lý tệp dưới dạng trình xử lý tệp. Thay vào đó, việc đăng ký xử lý tệp phải được thực hiện sau khi cài đặt và không bao giờ xảy ra nếu không có sự xác nhận rõ ràng của người dùng, đặc biệt là nếu một trang web sẽ trở thành trình xử lý mặc định. Thay vì xâm nhập vào các tiện ích hiện có như .json
mà người dùng có thể đã đăng ký trình xử lý mặc định, các trang web nên cân nhắc việc tạo tiện ích riêng.
Sự minh bạch
Tất cả hệ điều hành đều cho phép người dùng thay đổi các mối liên kết tệp hiện có. Điều này nằm ngoài phạm vi của trình duyệt.
Phản hồi
Nhóm Chrome muốn biết trải nghiệm của bạn với File Handling API.
Giới thiệu cho chúng tôi về thiết kế API
Có điều gì về API không hoạt động như bạn mong đợi không? Hay có phương thức hoặc thuộc tính nào bị thiếu mà bạn cần để triển khai ý tưởng của mình không? Bạn có câu hỏi hoặc nhận xét về mô hình bảo mật không?
- Gửi vấn đề về thông số kỹ thuật trên kho lưu trữ GitHub tương ứng hoặc thêm ý kiến của bạn vào một vấn đề hiện có.
Báo cáo vấn đề về việc triển khai
Bạn có phát hiện lỗi khi triển khai Chrome không? Hay cách triển khai có khác với thông số kỹ thuật không?
- Báo lỗi tại new.crbug.com. Hãy nhớ cung cấp nhiều thông tin chi tiết nhất có thể, các hướng dẫn đơn giản để tái tạo và nhập
UI>Browser>WebAppInstalls>FileHandling
vào hộp Components (Thành phần). Glitch rất hữu ích để chia sẻ các bản lặp lại nhanh chóng và dễ dàng.
Hỗ trợ API
Bạn có dự định sử dụng API Xử lý tệp không? Sự ủng hộ công khai của bạn giúp nhóm Chrome ưu tiên các tính năng và cho các nhà cung cấp trình duyệt khác thấy tầm quan trọng của việc hỗ trợ các tính năng đó.
- Hãy chia sẻ cách bạn dự định sử dụng công cụ này trên luồng thảo luận Discourse của WICG.
- Gửi một tweet đến @ChromiumDev bằng hashtag
#FileHandling
và cho chúng tôi biết bạn đang sử dụng ở đâu và như thế nào.
Đường liên kết hữu ích
- Video giải thích công khai
- Bản minh hoạ về API Xử lý tệp | Nguồn minh hoạ về API Xử lý tệp
- Lỗi theo dõi Chromium
- Mục nhập trên ChromeStatus.com
- Thành phần Blink:
UI>Browser>WebAppInstalls>FileHandling
- Bài đánh giá TAG
- Quan điểm của Mozilla về tiêu chuẩn
Xác nhận
File Xử lý API là API do Eric Willigers, Jay Harris và Raymes Khoury chỉ định. Bài viết này đã được Joe Medley xem xét.