مدير تنزيل ملفات بسيط وسهل الاستخدام لتطبيقات Electron. تم تصميمه استجابة للعديد من المشكلات المتعلقة بـ electron-dl
ويوفر حلاً أكثر قوة وموثوقية لتنزيل الملفات في Electron.
حالات الاستخدام:
تنزيل الملفات من URL
احصل على معرف مرتبط بالتنزيل لتتبعه
يمكنك إظهار مربع حوار "حفظ باسم" بشكل اختياري
احصل على تحديثات التقدم عند التنزيل
تكون قادرة على إلغاء / إيقاف مؤقت / استئناف التنزيلات
دعم التنزيلات المتعددة في وقت واحد
مطلوب الإلكترون 26.0.0 أو الأحدث.
// في العملية الرئيسية// ليس مثالًا عمليًا، مجرد عرض توضيحي لـ APIimport { ElectronDownloadManager } من 'electron-dl-manager';const manager = new ElectronDownloadManager();// ابدأ معرف downloadconst = انتظار manager.download( { النافذة: المتصفحWindowInstance، عنوان URL: "https://example.com/file.zip"، saveDialogOptions: {العنوان: "حفظ الملف"، }, عمليات الاسترجاعات: {onDownloadStarted: async ({ id, item, webContents }) => { // افعل شيئًا باستخدام معرف التنزيل},onDownloadProgress: async (...) => {},onDownloadCompleted: async (...) = > {}،onDownloadCancelled: غير متزامن (...) => {}،onDownloadInterrupted: غير متزامن (...) => {},onError: (خطأ، بيانات) => {}، }});manager.cancelDownload(id);manager.pauseDownload(id);manager.resumeDownload(id);
مدير تحميل الملفات الالكترونية
تثبيت
ابدء
واجهة برمجة التطبيقات
ملكيات
isDownloadInProgress()
isDownloadPaused()
isDownloadResumable()
isDownloadCancelled()
isDownloadInterrupted()
isDownloadCompleted()
تقدم تنسيق التنزيل
constructor()
download()
cancelDownload()
pauseDownload()
resumeDownload()
getActiveDownloadCount()
getDownloadData()
الواجهة: DownloadParams
الواجهة: DownloadManagerCallbacks
الفئة: ElectronDownloadManager
الفئة: DownloadData
فئة وهمية
التعليمات
شكر وتقدير
$ npm تثبيت Electro-dl-manager
ستحتاج إلى استخدام electron-dl-manager
في العملية الرئيسية لتطبيق Electron الخاص بك حيث ستتعامل مع تنزيلات الملفات.
في هذا المثال، نستخدم معالجات/مستدعيات IPC للتواصل بين العمليات الرئيسية وعمليات العارض، ولكن يمكنك استخدام أي استراتيجية IPC تريدها.
// MainIpcHandlers.tsimport { ElectronDownloadManager } from 'electron-dl-manager';import { ipcMain } from 'electron';const manager = new ElectronDownloadManager();// سوف يستدعي العارض هذا المعالج لبدء downloadipcMain.handle('download -ملف'، غير متزامن (حدث، وسيطات) => { const {url } = args; السماح لمعرف التنزيل const browserWindow = BrowserWindow.fromId(event.sender.id) // *يجب* عليك الاتصال بـ manager.download() مع انتظار أو // قد تحصل على سلوك غير متوقع downloadId = انتظار manager.download({window: browserWindow,url,// إذا كنت تريد التنزيل بدون حفظ كـ DiablosaveAsFilename: 'file.zip',directory: '/directory/where/to/save',// إذا كنت تريد التنزيل مع الحفظ باسم DialogSaveDialogOptions: { title: 'Save File',},callbacks: { // العنصر هو مثيل لـ Electron.DownloadItem onDownloadStarted: async ({ id, item,solveFilename }) => {// أرسل معرف التنزيل مرة أخرى إلى العارض مع // مع بعض البيانات الأخرى في databrowserWindow.webContents.invoc('download-started', { id, // اسم الملف سيتم حفظ الملف باسم الملف:solveFilename، // احصل على حجم الملف الذي سيتم تنزيله بالبايت، TotalBytes: item.getTotalBytes(),}); }, onDownloadProgress: async ({ id, item, بالمائةCompleted }) => {// أرسل تقدم التنزيل مرة أخرى إلى rendererbrowserWindow.webContents.invoc('download-progress', { id, بالمائة مكتمل، // احصل على عدد البايتات المستلمة حتى الآن bytesReceived: item.getReceivedBytes(),}); }, onDownloadCompleted: async ({ id, item }) => {// أرسل اكتمال التنزيل مرة أخرى إلى rendererbrowserWindow.webContents.invoc('download-Completed', { id, // احصل على المسار إلى الملف الذي تم تنزيله filePath: item.getSavePath(),}); }, onError: (err, data) => {// ... معالجة أي أخطاء }} }); // إيقاف التنزيل مؤقتًا manager.pauseDownload(downloadId);});
ElectronDownloadManager
يدير تنزيلات الملفات في تطبيق Electron.
constructor()
منشئ (المعلمات: DownloadManagerConstructorParams)
واجهة DownloadManagerConstructorParams { /** * إذا تم تحديده، فسيتم تسجيل الخروج من رسائل التصحيح الداخلية. مفيدة ل* استكشاف أخطاء التنزيلات وإصلاحها. لا يتم تسجيل التقدم بسبب * مدى تكراره. */ debugLogger؟: (الرسالة: سلسلة) => باطلة}
download()
يبدأ تنزيل الملف. إرجاع id
التنزيل.
تنزيل (المعلمات: DownloadParams): وعد<سلسلة>
DownloadParams
واجهة تنزيل المعلمات { /** * مثيل Electron.BrowserWindow */ النافذة: نافذة المتصفح /** * عنوان URL للتنزيل */ عنوان URL: سلسلة /** * عمليات الاسترجاعات المطلوب تحديدها للاستماع إلى أحداث التنزيل */ الاسترجاعات: DownloadManagerCallbacks /** * Electron.DownloadURLOptions لتمريرها إلى طريقة downloadURL * * @see https://www.electronjs.org/docs/latest/api/session#sesdownloadurlurl-options */ downloadURLOptions؟: Electron.DownloadURLOptions /** * إذا تم تحديده، فسيظهر مربع حوار حفظ عندما يقوم المستخدم * بتنزيل ملف. * * @ راجع https://www.electronjs.org/docs/latest/api/dialog#dialogshowsavedialogbrowserwindow-options */ saveDialogOptions؟: SaveDialogOptions /** * اسم الملف لحفظ الملف باسم. إذا لم يتم تحديده، فسيتم استخدام اسم الملف * من الخادم. * * ينطبق فقط إذا لم يتم تعريف saveDialogOptions. */ saveAsFilename ؟: سلسلة /** * الدليل الذي سيتم حفظ الملف فيه. يجب أن يكون المسار المطلق. * @default دليل التنزيلات الخاص بالمستخدم */ الدليل؟: سلسلة /** * إذا كان صحيحًا، فسيتم استبدال الملف إذا كان موجودًا بالفعل * @default false */ الكتابة؟: منطقية}
DownloadManagerCallbacks
واجهة DownloadManagerCallbacks { /** * عند بدء التنزيل. عند استخدام مربع الحوار "حفظ باسم"، * سيتم استدعاء هذا بعد قيام المستخدم بتحديد الموقع. * * سيتم دائمًا استدعاء هذا أولاً قبل التقدم والأحداث المكتملة. */ onDownloadStarted: (البيانات: DownloadData) => void /** * عندما يكون هناك تحديث التقدم أثناء التنزيل. ملاحظة: قد يتم تخطي هذا * بالكامل في بعض الحالات، حيث يكتمل التنزيل * على الفور. في هذه الحالة، سيتم استدعاء onDownloadCompleted * بدلاً من ذلك. */ onDownloadProgress: (البيانات: DownloadData) => void /** * عند اكتمال التنزيل */ onDownloadCompleted: (البيانات: DownloadData) => باطل /** * عند إلغاء التنزيل. يتم استدعاؤه أيضًا إذا قام المستخدم بإلغاء * من مربع حوار الحفظ باسم. */ onDownloadCancelled: (البيانات: DownloadData) => باطل /** * عند انقطاع التنزيل. قد يكون هذا بسبب اتصال سيئ *، أو تعطل الخادم، وما إلى ذلك. */ onDownloadInterrupted: (البيانات: DownloadData) => void /** * عند حدوث خطأ. *ملاحظة: التوقيع هو (خطأ، <ربما بعض البيانات>). */ onError: (خطأ: خطأ، بيانات؟: تنزيل البيانات) => باطل}
cancelDownload()
يلغي التنزيل.
إلغاء التنزيل (المعرف: سلسلة): باطل
pauseDownload()
يوقف التنزيل مؤقتًا.
وقفة التنزيل (المعرف: سلسلة): باطل
resumeDownload()
يستأنف التنزيل.
استئناف التنزيل (المعرف: سلسلة): باطل
getActiveDownloadCount()
إرجاع عدد التنزيلات النشطة.
getActiveDownloadCount(): الرقم
getDownloadData()
إرجاع بيانات التنزيل للتنزيل.
getDownloadData(id:string): DownloadData
DownloadData
تم إرجاع البيانات في عمليات الاسترجاعات للتنزيل.
فئة تنزيل البيانات { /** * المعرف الذي تم إنشاؤه للتنزيل */ المعرف: سلسلة /** * عنصر تحميل الإلكترون. استخدم هذا للحصول على اسم الملف والمسار وما إلى ذلك. * @انظر https://www.electronjs.org/docs/latest/api/download-item */ العنصر: تنزيل العنصر /** * محتويات الويب الإلكترونية * @انظر https://www.electronjs.org/docs/latest/api/web-contents */ محتويات الويب: محتويات الويب /** * حدث الإلكترون * @انظر https://www.electronjs.org/docs/latest/api/event */ حدث: حدث /** * اسم الملف الذي يتم حفظه على جهاز الكمبيوتر الخاص بالمستخدم. * يوصى باستخدام Item.getFilename() لأنه قد يكون غير دقيق عند استخدام مربع حوار الحفظ باسم. */ اسم الملف الذي تم حله: سلسلة /** * إذا كان صحيحًا، فقد تم إلغاء التنزيل من مربع حوار الحفظ باسم. ستكون هذه العلامة * صحيحة أيضًا إذا تم إلغاء التنزيل بواسطة التطبيق عند * استخدام مربع حوار الحفظ باسم. */ CancelledFromSaveAsDialog ؟: منطقي /** * النسبة المئوية للتنزيل المكتمل */ النسبة المئوية المكتملة: العدد /** * معدل التنزيل بالبايت في الثانية. */ تنزيلRateBytesPerSecond: الرقم /** * الوقت المقدر المتبقي بالثواني. */ الوقت المقدر المتبقي: الرقم /** * إذا تمت مقاطعة التنزيل، الحالة التي تمت مقاطعته منها */ تمت مقاطعته ؟: 'قيد التقدم' | 'مكتمل'}
يمكنك استخدام bytes
المكتبات و dayjs
لتنسيق تقدم التنزيل.
$ npm تثبيت بايت dayjs $ npm تثبيت @types/bytes --save-dev
استيراد وحدات البايت من "البايتات" استيراد dayjs من "dayjs" استيراد الوقت النسبي من "dayjs/plugin/relativeTime"؛ مدة الاستيراد من "dayjs/plugin/duration"؛dayjs.extend(relativeTime);dayjs.extend(duration);const downloadData = manager.getDownloadData(id); // أو DataItem من عمليات الاسترجاعات// سيُرجع شيئًا مثل 1.2 ميجابايت/sconst formattedDownloadRate = bytes(downloadData.downloadRateBytesPerSecond, {unitSeparator: ' ' }) + '/s'// سيُرجع شيئًا مثل "في بضع ثوانٍ"const formattedEstimatedTimeRemaining = dayjs.duration(downloadData.estimatedTimeRemainingSeconds, 'seconds').إنسانية (صحيح)
isDownloadInProgress()
يعود صحيحًا إذا كان التنزيل قيد التقدم.
isDownloadInProgress(): منطقي
isDownloadPaused()
يعود صحيحًا إذا تم إيقاف التنزيل مؤقتًا.
isDownloadPaused(): منطقي
isDownloadResumable()
يعود صحيحًا إذا كان التنزيل قابلاً للاستئناف.
isDownloadResumable(): منطقي
isDownloadCancelled()
يعود صحيحًا إذا تم إلغاء التنزيل.
isDownloadCancelled(): منطقي
isDownloadInterrupted()
يعود صحيحًا إذا تمت مقاطعة التنزيل.
isDownloadInterrupted(): منطقي
isDownloadCompleted()
يعود صحيحًا إذا اكتمل التنزيل.
isDownloadCompleted(): منطقي
إذا كنت تريد محاكاة ElectronDownloadManager
في اختباراتك، فيمكنك استخدام فئة ElectronDownloadManagerMock
.
import { ElectronDownloadManagerMock } from 'electron-dl-manager'
onError()
. لا يوفر Electron DownloadItem
طريقة واضحة لالتقاط أخطاء التنزيلات بشكل عام:
https://www.electronjs.org/docs/latest/api/download-item#class-downloaditem
(تحتوي فقط على أحداث on('updated')
و on('done')
، والتي تستخدمها هذه المكتبة لتحديد معالجات رد الاتصال.)
ما يفعله لعناوين URL غير الصالحة، سيؤدي إلى تشغيل رد الاتصال onDownloadCancelled()
.
معرف ثابت = انتظار المدير.تنزيل({ النافذة: النافذة الرئيسية، عنوان URL: "https://alkjsdflksjdflk.com/file.zip"، عمليات الاسترجاعات: {onDownloadCancelled: async (...) => { // تنزيل غير صالح؛ سيتم استدعاء رد الاتصال هذا}، }});
أفضل طريقة للتعامل مع هذا الأمر هي التحقق من وجود عنوان URL قبل التنزيل بنفسك. لم أتمكن من العثور على مكتبة شعرت أنها موثوقة لتضمينها في هذه الحزمة، لذا فمن الأفضل أن تجد مكتبة تناسبك:
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
يقترح GPT أيضًا الكود التالي (لم يتم اختباره):
وظيفة غير متزامنة urlExists(url: string): Promise<boolean> { حاول {const Response = انتظار الجلب(url, {method: 'HEAD' });return Response.ok; } قبض على (خطأ) {إرجاع خطأ؛ }}const موجود = في انتظار urlExists('https://example.com/file.jpg');
يستخدم هذا الرمز أجزاء صغيرة من electron-dl
ويتم الإشارة إليه في الكود حيث يتم استخدامه.
electron-dl
مرخص بموجب ترخيص MIT ويتم صيانته بواسطة Sindre Sorhus [email protected] (https://sindresorhus.com).