# Class (WebDownloadDelegate) Implements a **WebDownloadDelegate** object to notify users of the download state. > **NOTE** > > - The initial APIs of this module are supported since API version 9. Updates will be marked with a superscript to indicate their earliest API version. > > - The initial APIs of this class are supported since API version 11. > > - You can preview how this component looks on a real device, but not in DevEco Studio Previewer. ## Modules to Import ```ts import { webview } from '@kit.ArkWeb'; ``` ## onBeforeDownload11+ onBeforeDownload(callback: Callback\): void Invoked to notify users before the download starts. **WebDownloadItem.start("xxx")** must be called in this API, with a download path provided. Otherwise, the download remains in the PENDING state. > **NOTE** > >The file of the download task in the PENDING state is saved to a temporary directory. After the target path is specified by invoking **WebDownloadItem.start**, the temporary file is renamed as the target file, and the unfinished part is directly downloaded to the target path. To avoid generating temporary files before invoking **WebDownloadItem.start**, you can call **WebDownloadItem.cancel** to cancel the current download task and then call **WebDownloadManager.resumeDownload** to resume it. **System capability**: SystemCapability.Web.Webview.Core **Parameters** | Name | Type | Mandatory| Description | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | Yes | Callback for triggering a download.| **Example** ```ts // xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct WebComponent { controller: webview.WebviewController = new webview.WebviewController(); delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); download: webview.WebDownloadItem = new webview.WebDownloadItem(); failedData: Uint8Array = new Uint8Array(); build() { Column() { Button('setDownloadDelegate') .onClick(() => { try { this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { console.log("will start a download."); // Pass in a download path and start the download. webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.log("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.log("download failed guid: " + webDownloadItem.getGuid()); // Serialize the failed download to a byte array. this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.log("download finish guid: " + webDownloadItem.getGuid()); }) this.controller.setDownloadDelegate(this.delegate); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('startDownload') .onClick(() => { try { this.controller.startDownload('https://www.example.com'); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resumeDownload') .onClick(() => { try { webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('cancel') .onClick(() => { try { this.download.cancel(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('pause') .onClick(() => { try { this.download.pause(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resume') .onClick(() => { try { this.download.resume(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: 'www.example.com', controller: this.controller }) } } } ``` ## onDownloadUpdated11+ onDownloadUpdated(callback: Callback\): void Invoked when the download progress is updated. **System capability**: SystemCapability.Web.Webview.Core **Parameters** | Name | Type | Mandatory| Description | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | Yes | Callback invoked when the downloaded progress is updated.| **Example** ```ts // xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct WebComponent { controller: webview.WebviewController = new webview.WebviewController(); delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); download: webview.WebDownloadItem = new webview.WebDownloadItem(); failedData: Uint8Array = new Uint8Array(); build() { Column() { Button('setDownloadDelegate') .onClick(() => { try { this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { console.log("will start a download."); // Pass in a download path and start the download. webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.log("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.log("download failed guid: " + webDownloadItem.getGuid()); // Serialize the failed download to a byte array. this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.log("download finish guid: " + webDownloadItem.getGuid()); }) this.controller.setDownloadDelegate(this.delegate); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('startDownload') .onClick(() => { try { this.controller.startDownload('https://www.example.com'); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resumeDownload') .onClick(() => { try { webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('cancel') .onClick(() => { try { this.download.cancel(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('pause') .onClick(() => { try { this.download.pause(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resume') .onClick(() => { try { this.download.resume(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: 'www.example.com', controller: this.controller }) } } } ``` ## onDownloadFinish11+ onDownloadFinish(callback: Callback\): void Invoked when the download is complete. **System capability**: SystemCapability.Web.Webview.Core **Parameters** | Name | Type | Mandatory| Description | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | Yes | Callback invoked when the download is complete.| **Example** ```ts // xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct WebComponent { controller: webview.WebviewController = new webview.WebviewController(); delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); download: webview.WebDownloadItem = new webview.WebDownloadItem(); failedData: Uint8Array = new Uint8Array(); build() { Column() { Button('setDownloadDelegate') .onClick(() => { try { this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { console.log("will start a download."); // Pass in a download path and start the download. webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.log("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.log("download failed guid: " + webDownloadItem.getGuid()); // Serialize the failed download to a byte array. this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.log("download finish guid: " + webDownloadItem.getGuid()); }) this.controller.setDownloadDelegate(this.delegate); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('startDownload') .onClick(() => { try { this.controller.startDownload('https://www.example.com'); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resumeDownload') .onClick(() => { try { webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('cancel') .onClick(() => { try { this.download.cancel(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('pause') .onClick(() => { try { this.download.pause(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resume') .onClick(() => { try { this.download.resume(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: 'www.example.com', controller: this.controller }) } } } ``` ## onDownloadFailed11+ onDownloadFailed(callback: Callback\): void Invoked when the download fails. **System capability**: SystemCapability.Web.Webview.Core **Parameters** | Name | Type | Mandatory| Description | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | Yes | Callback invoked when the download fails.| **Example** ```ts // xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct WebComponent { controller: webview.WebviewController = new webview.WebviewController(); delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); download: webview.WebDownloadItem = new webview.WebDownloadItem(); failedData: Uint8Array = new Uint8Array(); build() { Column() { Button('setDownloadDelegate') .onClick(() => { try { this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { console.log("will start a download."); // Pass in a download path and start the download. webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.log("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.log("download failed guid: " + webDownloadItem.getGuid()); // Serialize the failed download to a byte array. this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.log("download finish guid: " + webDownloadItem.getGuid()); }) this.controller.setDownloadDelegate(this.delegate); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('startDownload') .onClick(() => { try { this.controller.startDownload('https://www.example.com'); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resumeDownload') .onClick(() => { try { webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('cancel') .onClick(() => { try { this.download.cancel(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('pause') .onClick(() => { try { this.download.pause(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('resume') .onClick(() => { try { this.download.resume(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: 'www.example.com', controller: this.controller }) } } } ```