โปรแกรมจัดการดาวน์โหลดไฟล์ที่ง่ายและสะดวกสำหรับแอปพลิเคชัน Electron ออกแบบมาเพื่อตอบสนองต่อปัญหาต่างๆ มากมายเกี่ยวกับ electron-dl
และมอบโซลูชันที่มีประสิทธิภาพและเชื่อถือได้มากขึ้นสำหรับการดาวน์โหลดไฟล์ใน Electron
กรณีการใช้งาน:
ดาวน์โหลดไฟล์จาก URL
รับรหัสที่เกี่ยวข้องกับการดาวน์โหลดเพื่อติดตาม
เลือกแสดงกล่องโต้ตอบ "บันทึกเป็น"
รับการอัปเดตความคืบหน้าในการดาวน์โหลด
สามารถยกเลิก / หยุดชั่วคราว / ทำการดาวน์โหลดต่อได้
รองรับการดาวน์โหลดหลายรายการพร้อมกัน
ต้องใช้อิเล็กตรอน 26.0.0 หรือใหม่กว่า
// ในกระบวนการหลัก// ไม่ใช่ตัวอย่างที่ใช้งานได้ เป็นเพียงการสาธิต APIimport { ElectronDownloadManager } จาก 'electron-dl-manager';const manager = new ElectronDownloadManager();// เริ่มการดาวน์โหลดconst id = await manager.download( { หน้าต่าง: เบราว์เซอร์ WindowInstance, URL: 'https://example.com/file.zip', saveDialogOptions: {หัวข้อ: 'บันทึกไฟล์', - โทรกลับ: {onDownloadStarted: async ({ id, item, webContents }) => { // Do Something with the download id},onDownloadProgress: async (...) => {},onDownloadCompleted: async (...) = > {},onDownloadCancelled: async (...) => {},onDownloadInterrupted: async (...) => {},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 ติดตั้งอิเล็กตรอน-dl-manager
คุณจะต้องใช้ electron-dl-manager
ในกระบวนการหลักของแอปพลิเคชัน Electron ของคุณ ซึ่งคุณจะจัดการกับไฟล์ที่ดาวน์โหลด
ในตัวอย่างนี้ เราใช้ตัวจัดการ IPC / ตัวเรียกใช้งานเพื่อสื่อสารระหว่างกระบวนการหลักและกระบวนการเรนเดอร์ แต่คุณสามารถใช้กลยุทธ์ IPC ใดก็ได้ที่คุณต้องการ
// MainIpcHandlers.tsimport { ElectronDownloadManager } จาก 'electron-dl-manager';import { ipcMain } จาก 'electron';const manager = new ElectronDownloadManager();// Renderer จะเรียกใช้ตัวจัดการนี้เพื่อเริ่ม downloadipcMain.handle('download -file', async (เหตุการณ์, args) => { const { url } = args; ให้ดาวน์โหลดId const browserWindow = BrowserWindow.fromId (event.sender.id) // คุณ *ต้อง* โทรไปที่ manager.download() พร้อมรอหรือ // คุณอาจได้รับพฤติกรรมที่ไม่คาดคิด downloadId = await manager.download({window: browserWindow,url,// หากคุณต้องการดาวน์โหลดโดยไม่บันทึกเป็น DialogsaveAsFilename: 'file.zip',directory: '/directory/where/to/save',// หากคุณ ต้องการดาวน์โหลดพร้อมบันทึกเป็น DialogsaveDialogOptions: { title: 'Save File',},callbacks: { // item is an instance of Electron.DownloadItem onDownloadStarted: async ({ id, item, solvedFilename }) => {// ส่ง id ดาวน์โหลดกลับไปยังตัวเรนเดอร์พร้อมกับ// พร้อมด้วย databrowserWindow.webContents.invoid('download-started', { id, // ชื่อไฟล์) ว่าไฟล์จะถูกบันทึกเป็นชื่อไฟล์: solvedFilename, // รับขนาดไฟล์ที่จะดาวน์โหลดในหน่วยไบต์ TotalBytes: item.getTotalBytes(),}); }, onDownloadProgress: async ({ id, item, percentCompleted }) => {// ส่งความคืบหน้าการดาวน์โหลดกลับไปที่ rendererbrowserWindow.webContents.invoid('download-progress', { id, percentCompleted, // รับจำนวนไบต์ ได้รับแล้ว bytesReceived: item.getReceivedBytes(),}); }, onDownloadCompleted: async ({ id, item }) => {// ส่งการดาวน์โหลดเสร็จสิ้นกลับไปที่ rendererbrowserWindow.webContents.invoid('download-completed', { id, // รับเส้นทางไปยังไฟล์ที่ถูกดาวน์โหลด filePath: item.getSavePath(),}) ; }, onError: (ผิดพลาด ข้อมูล) => {// ... จัดการข้อผิดพลาดใดๆ }} - // หยุดการดาวน์โหลดชั่วคราว manager.pauseDownload(downloadId);});
ElectronDownloadManager
จัดการการดาวน์โหลดไฟล์ในแอปพลิเคชัน Electron
constructor()
ตัวสร้าง (พารามิเตอร์: DownloadManagerConstructorParams)
อินเทอร์เฟซ DownloadManagerConstructorParams { /** * หากกำหนดไว้ จะออกจากระบบข้อความแก้ไขข้อบกพร่องภายใน มีประโยชน์สำหรับ * การแก้ไขปัญหาการดาวน์โหลด ไม่ออกจากระบบความคืบหน้าเนื่องจาก * สามารถทำได้บ่อยแค่ไหน - debugLogger?: (ข้อความ: สตริง) => เป็นโมฆะ}
download()
เริ่มการดาวน์โหลดไฟล์ ส่งกลับ id
ของการดาวน์โหลด
ดาวน์โหลด (พารามิเตอร์: DownloadParams): สัญญา <string>
DownloadParams
อินเทอร์เฟซ DownloadParams { /** * อินสแตนซ์ Electron.BrowserWindow */ หน้าต่าง: BrowserWindow /** * URL ที่จะดาวน์โหลด */ URL: สตริง /** * โทรกลับเพื่อกำหนดเพื่อฟังเหตุการณ์การดาวน์โหลด */ โทรกลับ: DownloadManagerCallbacks /** * Electron.DownloadURLOptions เพื่อส่งผ่านไปยังวิธี downloadURL * * @see https://www.electronjs.org/docs/latest/api/session#sesdownloadurlurl-options */ downloadURLOptions?: Electron.DownloadURLOptions /** * หากกำหนดไว้ จะแสดงกล่องโต้ตอบบันทึกเมื่อผู้ใช้ * ดาวน์โหลดไฟล์ * * @see https://www.electronjs.org/docs/latest/api/dialog#dialogshowsavedialogbrowserwindow-options */ saveDialogOptions?: SaveDialogOptions /** * ชื่อไฟล์ที่จะบันทึกไฟล์เป็น หากไม่ได้กำหนด ชื่อไฟล์ * จากเซิร์ฟเวอร์จะถูกนำมาใช้ * * ใช้ได้เฉพาะเมื่อไม่ได้กำหนด saveDialogOptions - saveAsFilename?: string /** * ไดเร็กทอรีที่จะบันทึกไฟล์ จะต้องเป็นเส้นทางที่แน่นอน * @default ไดเร็กทอรีดาวน์โหลดของผู้ใช้ */ ไดเรกทอรี?: string /** * ถ้าเป็นจริงจะเขียนทับไฟล์ถ้ามีอยู่แล้ว * @default false */ เขียนทับ?: บูลีน}
DownloadManagerCallbacks
อินเทอร์เฟซ DownloadManagerCallbacks { /** * เมื่อการดาวน์โหลดเริ่มต้นขึ้น เมื่อใช้กล่องโต้ตอบ "บันทึกเป็น" * จะถูกเรียกหลังจากที่ผู้ใช้เลือกตำแหน่งแล้ว * * สิ่งนี้จะถูกเรียกก่อนเสมอก่อนความคืบหน้าและเหตุการณ์ที่เสร็จสิ้น - onDownloadStarted: (ข้อมูล: DownloadData) => void /** * เมื่อมีการอัพเดตความคืบหน้าในการดาวน์โหลด หมายเหตุ: * นี้อาจถูกข้ามไปโดยสิ้นเชิงในบางกรณี ซึ่งการดาวน์โหลด * จะเสร็จสิ้นทันที ในกรณีนั้น onDownloadCompleted * จะถูกเรียกแทน - onDownloadProgress: (ข้อมูล: DownloadData) => void /** * เมื่อการดาวน์โหลดเสร็จสิ้น */ onDownloadCompleted: (ข้อมูล: DownloadData) => void /** * เมื่อการดาวน์โหลดถูกยกเลิก เรียกอีกอย่างว่าหากผู้ใช้ยกเลิก * จากกล่องโต้ตอบบันทึกเป็น - onDownloadCancelled: (ข้อมูล: DownloadData) => void /** * เมื่อการดาวน์โหลดถูกขัดจังหวะ อาจเป็นเพราะการเชื่อมต่อ * ไม่ดี เซิร์ฟเวอร์ล่ม ฯลฯ */ onDownloadInterrupted: (ข้อมูล: DownloadData) => void /** * เมื่อพบข้อผิดพลาด * หมายเหตุ: ลายเซ็นคือ (ข้อผิดพลาด <อาจมีข้อมูลบางส่วน>) - onError: (ข้อผิดพลาด: ข้อผิดพลาด ข้อมูล?: DownloadData) => เป็นโมฆะ}
cancelDownload()
ยกเลิกการดาวน์โหลด
cancelDownload (id: string): เป็นโมฆะ
pauseDownload()
หยุดการดาวน์โหลดชั่วคราว
PauseDownload(id: string): เป็นโมฆะ
resumeDownload()
ทำการดาวน์โหลดต่อ
resumeDownload (id: string): เป็นโมฆะ
getActiveDownloadCount()
ส่งกลับจำนวนการดาวน์โหลดที่ใช้งานอยู่
getActiveDownloadCount(): หมายเลข
getDownloadData()
ส่งคืนข้อมูลการดาวน์โหลดสำหรับการดาวน์โหลด
getDownloadData(id: string): DownloadData
DownloadData
ข้อมูลที่ส่งคืนในการเรียกกลับสำหรับการดาวน์โหลด
ข้อมูลการดาวน์โหลดคลาส { /** * ID ที่สร้างขึ้นสำหรับการดาวน์โหลด */ รหัส: string /** * The Electron.DownloadItem. ใช้สิ่งนี้เพื่อดึงชื่อไฟล์ เส้นทาง ฯลฯ * @see https://www.electronjs.org/docs/latest/api/download-item */ รายการ: รายการดาวน์โหลด /** * The Electron.WebContents * @see https://www.electronjs.org/docs/latest/api/web-contents */ เนื้อหาเว็บ: เนื้อหาเว็บ /** * The Electron.Event * @see https://www.electronjs.org/docs/latest/api/event */ เหตุการณ์: เหตุการณ์ /** * ชื่อไฟล์ที่กำลังบันทึกลงในคอมพิวเตอร์ของผู้ใช้ * แนะนำมากกว่า Item.getFilename() เนื่องจากอาจไม่ถูกต้องเมื่อใช้บันทึกเป็นกล่องโต้ตอบ - ชื่อไฟล์ที่ได้รับการแก้ไข: string /** * หากเป็นจริง การดาวน์โหลดจะถูกยกเลิกจากกล่องโต้ตอบบันทึกเป็น การตั้งค่าสถานะ * นี้จะเป็นจริงเช่นกันหากการดาวน์โหลดถูกยกเลิกโดยแอปพลิเคชัน เมื่อ * ใช้กล่องโต้ตอบบันทึกเป็น - cancelledFromSaveAsDialog?: boolean /** * เปอร์เซ็นต์ของการดาวน์โหลดที่เสร็จสิ้น */ เปอร์เซ็นต์เสร็จสมบูรณ์: จำนวน /** * อัตราการดาวน์โหลดเป็นไบต์ต่อวินาที - downloadRateBytesPerSecond: หมายเลข /** * เวลาโดยประมาณที่เหลืออยู่ในหน่วยวินาที - ประมาณเวลาที่เหลืออยู่วินาที: หมายเลข /** * หากการดาวน์โหลดถูกขัดจังหวะ สถานะที่ถูกขัดจังหวะจาก */ ขัดจังหวะผ่าน?: 'อยู่ระหว่างดำเนินการ' | 'สมบูรณ์'}
คุณสามารถใช้ bytes
ของไลบรารีและ dayjs
เพื่อจัดรูปแบบความคืบหน้าการดาวน์โหลด
$ npm ติดตั้งไบต์ dayjs $ npm ติดตั้ง @types/bytes --save-dev
นำเข้าไบต์จาก 'ไบต์' นำเข้า dayjs จาก 'dayjs' นำเข้าญาติเวลาจาก 'dayjs/plugin/relativeTime'; ระยะเวลานำเข้าจาก 'dayjs/plugin/duration'; dayjs.extend (relativeTime); dayjs.extend (ระยะเวลา) const downloadData = manager.getDownloadData(id); // หรือ DataItem จากการเรียกกลับ// จะคืนค่าประมาณ 1.2 MB/sconst formattedDownloadRate = bytes(downloadData.downloadRateBytesPerSecond, { unitSeparator: ' ' }) + '/s'// จะส่งคืนค่าประมาณ "in aไม่กี่วินาที"const formattedEstimatedTimeRemaining = dayjs.duration (ดาวน์โหลด Data.estimatedTimeRemainingSeconds, 'วินาที') ทำให้มีมนุษยธรรม (จริง)
isDownloadInProgress()
คืนค่าเป็นจริงหากกำลังดาวน์โหลดอยู่
isDownloadInProgress(): boolean
isDownloadPaused()
คืนค่าเป็นจริงหากการดาวน์โหลดหยุดชั่วคราว
isDownloadPaused(): boolean
isDownloadResumable()
คืนค่าเป็นจริงหากการดาวน์โหลดกลับมาทำงานต่อได้
isDownloadResumable(): boolean
isDownloadCancelled()
คืนค่าเป็นจริงหากการดาวน์โหลดถูกยกเลิก
isDownloadCancelled(): boolean
isDownloadInterrupted()
คืนค่าเป็นจริงหากการดาวน์โหลดถูกขัดจังหวะ
isDownloadInterrupted(): boolean
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()
const id = รอผู้จัดการดาวน์โหลด ({ หน้าต่าง: mainWindow, URL: 'https://alkjsdflksjdflk.com/file.zip', โทรกลับ: {onDownloadCancelled: async (...) => { // การดาวน์โหลดไม่ถูกต้อง; การโทรกลับนี้จะถูกเรียก}, -
วิธีที่ดีกว่าในการจัดการสิ่งนี้คือการตรวจสอบว่ามี URL อยู่ก่อนที่จะดาวน์โหลดด้วยตัวเองหรือไม่ ฉันไม่พบห้องสมุดที่รู้สึกว่าเชื่อถือได้ที่จะรวมไว้ในแพ็คเกจนี้ ดังนั้นจึงเป็นการดีที่สุดที่คุณจะพบห้องสมุดที่เหมาะกับคุณ:
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
GPT ยังแนะนำรหัสต่อไปนี้ (ยังไม่ได้ทดสอบ):
ฟังก์ชัน async urlExists (url: สตริง): สัญญา <boolean> { ลอง {const response = await fetch(url, { method: 'HEAD' });return response.ok; } catch (ข้อผิดพลาด) {return false; }}const มีอยู่ = รอ urlExists('https://example.com/file.jpg');
รหัสนี้ใช้ส่วนเล็กๆ จาก electron-dl
และระบุไว้ในโค้ดที่ใช้
electron-dl
ได้รับอนุญาตภายใต้ใบอนุญาต MIT และได้รับการดูแลโดย Sindre Sorhus [email protected] (https://sindresorhus.com)