یک برنامه را به عنوان یک کنترل کننده فایل در سیستم عامل ثبت کنید.
اکنون که برنامههای وب قادر به خواندن و نوشتن فایلها هستند، قدم منطقی بعدی این است که به توسعهدهندگان اجازه دهید همین برنامههای وب را بهعنوان مدیریتکننده فایل برای فایلهایی که برنامههایشان میتوانند ایجاد و پردازش کنند، اعلام کنند. File Handling API به شما امکان می دهد دقیقاً این کار را انجام دهید. پس از ثبت یک برنامه ویرایشگر متن به عنوان کنترل کننده فایل و پس از نصب آن، می توانید روی یک فایل .txt
در macOS کلیک راست کرده و "دریافت اطلاعات" را انتخاب کنید تا سپس به سیستم عامل دستور دهید که همیشه فایل های .txt
را با این برنامه به عنوان پیش فرض باز کند. .
موارد استفاده پیشنهادی برای File Handling API
نمونه هایی از سایت هایی که ممکن است از این API استفاده کنند عبارتند از:
- برنامه های آفیس مانند ویرایشگرهای متن، برنامه های صفحه گسترده و سازندگان نمایش اسلاید.
- ویرایشگرهای گرافیکی و ابزارهای طراحی.
- ابزارهای ویرایشگر سطح بازی های ویدیویی.
نحوه استفاده از File Handling API
افزایش پیشرونده
File Handling API به خودی خود نمی تواند چند پر شود. با این حال، عملکرد باز کردن فایل ها با یک برنامه وب، از طریق دو روش دیگر قابل دستیابی است:
- Web Share Target API به توسعه دهندگان اجازه می دهد تا برنامه خود را به عنوان هدف اشتراک گذاری مشخص کنند تا فایل ها از برگه اشتراک سیستم عامل باز شوند.
- File System Access API را می توان با کشیدن و رها کردن فایل ادغام کرد، بنابراین توسعه دهندگان می توانند فایل های رها شده را در برنامه از قبل باز شده مدیریت کنند.
پشتیبانی از مرورگر
تشخیص ویژگی
برای بررسی اینکه آیا File Handling API پشتیبانی میشود، از موارد زیر استفاده کنید:
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
// The File Handling API is supported.
}
بخش اعلامی File Handling API
به عنوان اولین گام، برنامه های وب باید به طور شفاف در مانیفست برنامه وب خود توضیح دهند که چه نوع فایل هایی را می توانند مدیریت کنند. File Handling API مانیفست برنامه وب را با ویژگی جدیدی به نام "file_handlers"
گسترش میدهد که آرایهای از، خوب، کنترلکنندههای فایل را میپذیرد. یک کنترل کننده فایل یک شی با این ویژگی ها است:
- یک ویژگی
"action"
که به یک URL در محدوده برنامه به عنوان مقدار آن اشاره می کند. - یک ویژگی
"accept"
با یک شی از انواع MIME به عنوان کلید و لیستی از پسوند فایل به عنوان مقادیر آنها. - یک ویژگی
"icons"
با آرایه ای از نمادهایImageResource
. برخی از سیستمعاملها به یک انجمن نوع فایل اجازه میدهند تا نمادی را نمایش دهد که فقط نماد برنامه مرتبط نیست، بلکه یک نماد خاص مربوط به استفاده از آن نوع فایل با برنامه است. - ویژگی
"launch_type"
که تعیین می کند چندین فایل باید در یک کلاینت باز شوند یا در چندین کلاینت. پیش فرض"single-client"
است. اگر کاربر چندین فایل را باز کند و اگر کنترل کننده فایل با"multiple-clients"
به عنوان"launch_type"
حاشیه نویسی شده باشد، بیش از یک برنامه راه اندازی می شود و برای هر راه اندازی، آرایهLaunchParams.files
( به پایین مراجعه کنید) انجام می شود. فقط یک عنصر دارند
مثال زیر که فقط گزیده مربوط به مانیفست برنامه وب را نشان می دهد، باید آن را واضح تر کند:
{
"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"
}
]
}
این برای یک برنامه فرضی است که فایلهای مقدار جدا شده با کاما ( .csv
) را در /open-csv
، فایلهای گرافیکی برداری مقیاسپذیر ( .svg
) در /open-svg
و یک فرمت فایل Grafr ساخته شده با هر یک از .grafr
را مدیریت میکند. ، .graf
، یا .graph
به عنوان پسوند در /open-graf
. دو مورد اول در یک کلاینت منفرد باز میشوند و آخرین مورد در چندین کلاینت در صورتی که چندین فایل در حال مدیریت باشند باز میشوند.
بخش ضروری File Handling API
اکنون که برنامه اعلام کرده است که در تئوری چه فایلهایی را میتواند در کدام URL درون محدوده مدیریت کند، باید در عمل با فایلهای دریافتی کاری انجام دهد. اینجاست که launchQueue
وارد عمل می شود. برای دسترسی به فایل های راه اندازی شده، سایت باید یک مصرف کننده برای شی window.launchQueue
مشخص کند. راه اندازی ها در صف قرار می گیرند تا زمانی که توسط مصرف کننده مشخص شده مدیریت شوند، که دقیقاً یک بار برای هر راه اندازی فراخوانی می شود. به این ترتیب، هر راه اندازی بدون توجه به زمانی که مصرف کننده مشخص شده است، انجام می شود.
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.
}
});
}
پشتیبانی DevTools
در زمان نوشتن این مقاله هیچ پشتیبانی DevTools وجود ندارد، اما من یک درخواست ویژگی برای اضافه شدن پشتیبانی ارسال کرده ام.
نسخه ی نمایشی
من پشتیبانی مدیریت فایل را به Excalidraw ، یک برنامه طراحی به سبک کارتونی اضافه کرده ام. برای تست آن ابتدا باید Excalidraw را نصب کنید. هنگامی که یک فایل با آن ایجاد می کنید و آن را در جایی از سیستم فایل خود ذخیره می کنید، می توانید فایل را با دوبار کلیک یا کلیک راست باز کنید و سپس "Excalidraw" را در منوی زمینه انتخاب کنید. می توانید پیاده سازی را در کد منبع بررسی کنید.
امنیت
تیم Chrome با استفاده از اصول اصلی تعریف شده در کنترل دسترسی به ویژگیهای قدرتمند پلتفرم وب ، از جمله کنترل کاربر، شفافیت و ارگونومی، API مدیریت فایل را طراحی و پیادهسازی کرده است.
مجوزها، تداوم مجوزها و بهروزرسانیهای کنترلکننده فایل
برای اطمینان از اعتماد کاربر و ایمنی فایلهای کاربران، هنگامی که API مدیریت فایل یک فایل را باز میکند، قبل از اینکه PWA بتواند فایلی را مشاهده کند، یک درخواست مجوز نشان داده میشود. این درخواست مجوز درست پس از اینکه کاربر PWA را برای باز کردن یک فایل انتخاب کرد، نشان داده میشود، به طوری که مجوز به طور محکم با عمل باز کردن یک فایل با استفاده از PWA همراه است و آن را قابل درکتر و مرتبطتر میکند.
این مجوز هر بار نشان داده میشود تا زمانی که کاربر روی «اجازه یا مسدود کردن مدیریت فایل برای سایت» کلیک کند، یا سه بار درخواست را نادیده بگیرد (پس از آن Chromium این مجوز را تحریم و مسدود میکند). تنظیم انتخاب شده در سراسر بسته شدن و بازگشایی PWA باقی خواهد ماند.
وقتی بهروزرسانیها و تغییرات مانیفست در بخش "file_handlers"
شناسایی شد، مجوزها بازنشانی میشوند.
چالش های مرتبط با فایل
دسته بزرگی از بردارهای حمله وجود دارد که با اجازه دادن به وب سایت ها برای دسترسی به فایل ها باز می شوند. این موارد در مقاله مربوط به File System Access API توضیح داده شده است. قابلیت امنیتی اضافی که File Handling API بر روی File System Access API فراهم میکند، امکان دسترسی به فایلهای خاص از طریق رابط کاربری داخلی سیستم عامل است، در مقابل از طریق یک انتخابگر فایل که توسط یک برنامه وب نشان داده میشود.
هنوز این خطر وجود دارد که کاربران به طور ناخواسته به یک برنامه وب با باز کردن یک فایل، اجازه دسترسی به آن را بدهند. با این حال، به طور کلی درک می شود که باز کردن یک فایل به برنامه ای که با آن باز می شود اجازه می دهد آن فایل را بخواند و/یا دستکاری کند. بنابراین، انتخاب صریح کاربر برای باز کردن یک فایل در یک برنامه نصب شده، از جمله از طریق منوی زمینه "باز کردن با..."، می تواند به عنوان یک سیگنال کافی برای اعتماد به برنامه خوانده شود.
چالش های کنترل کننده پیش فرض
استثنا در این مورد زمانی است که هیچ برنامه کاربردی در سیستم میزبان برای یک نوع فایل مشخص وجود ندارد. در این حالت، برخی از سیستمعاملهای میزبان ممکن است بهطور خودکار کنترلکنندهای که به تازگی ثبتشده است را به کنترلکننده پیشفرض برای آن نوع فایل، بیصدا و بدون دخالت کاربر ارتقا دهند. این بدان معنی است که اگر کاربر روی فایلی از آن نوع دوبار کلیک کند، به طور خودکار در برنامه وب ثبت شده باز می شود. در چنین سیستمعاملهای میزبانی، زمانی که عامل کاربر تشخیص میدهد که کنترلکننده پیشفرض موجود برای نوع فایل وجود ندارد، ممکن است یک درخواست مجوز صریح برای جلوگیری از ارسال تصادفی محتوای یک فایل به یک برنامه وب بدون رضایت کاربر ضروری باشد.
کنترل کاربر
این مشخصات بیان میکند که مرورگرها نباید هر سایتی را که میتواند فایلها را مدیریت کند، بهعنوان مدیریتکننده فایل ثبت کند. درعوض، ثبت نام مدیریت فایل باید در پشت نصب باشد و هرگز بدون تأیید صریح کاربر اتفاق نمیافتد، به خصوص اگر یک سایت به مدیریت پیشفرض تبدیل شود. به جای ربودن افزونههای موجود مانند .json
که کاربر احتمالاً قبلاً یک کنترلکننده پیشفرض برای آن ثبتنام کرده است، سایتها باید برنامههای افزودنی خود را ایجاد کنند.
شفافیت
همه سیستمعاملها به کاربران اجازه میدهند تا پیوندهای فایل موجود را تغییر دهند. این خارج از محدوده مرورگر است.
بازخورد
تیم Chrome میخواهد درباره تجربیات شما با File Handling API بشنود.
در مورد طراحی API به ما بگویید
آیا چیزی در مورد API وجود دارد که آنطور که انتظار داشتید کار نمی کند؟ یا آیا روش ها یا ویژگی هایی وجود دارد که برای اجرای ایده خود به آنها نیاز دارید؟ سوال یا نظری در مورد مدل امنیتی دارید؟
- یک مشکل مشخصات را در مخزن GitHub مربوطه ثبت کنید یا افکار خود را به یک مشکل موجود اضافه کنید.
گزارش مشکل در اجرا
آیا اشکالی در پیاده سازی کروم پیدا کردید؟ یا اجرا با مشخصات متفاوت است؟
- یک اشکال را در new.crbug.com ثبت کنید. اطمینان حاصل کنید که تا جایی که می توانید جزئیات، دستورالعمل های ساده برای بازتولید را وارد کنید و
UI>Browser>WebAppInstalls>FileHandling
در کادر Components وارد کنید. Glitch برای به اشتراک گذاری سریع و آسان تکرارها عالی عمل می کند.
پشتیبانی از API را نشان دهید
آیا قصد دارید از File Handling API استفاده کنید؟ پشتیبانی عمومی شما به تیم Chrome کمک میکند ویژگیها را اولویتبندی کند و به سایر فروشندگان مرورگر نشان میدهد که چقدر حمایت از آنها ضروری است.
- نحوه استفاده از آن را در موضوع WICG Discourse به اشتراک بگذارید.
- با استفاده از هشتگ
#FileHandling
یک توییت به ChromiumDev@ ارسال کنید و به ما اطلاع دهید که کجا و چگونه از آن استفاده میکنید.
لینک های مفید
- توضیح دهنده عمومی
- نسخه ی نمایشی API Handling File | منبع آزمایشی API Handling File
- اشکال ردیابی کروم
- ورودی ChromeStatus.com
- کامپوننت چشمک زدن:
UI>Browser>WebAppInstalls>FileHandling
- بررسی تگ
- موقعیت استاندارد موزیلا
قدردانی ها
File Handling API توسط Eric Willigers ، Jay Harris و Raymes Khoury مشخص شده است. این مقاله توسط جو مدلی بررسی شده است.