# Class (WebDownloadDelegate) 下载任务的状态会通过该类的回调接口通知给用户。 > **说明:** > > - 本模块首批接口从API version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 > > - 本Class首批接口从API version 11开始支持。 > > - 示例效果请以真机运行为准,当前DevEco Studio预览器不支持。 ## 导入模块 ```ts import { webview } from '@kit.ArkWeb'; ``` ## onBeforeDownload11+ onBeforeDownload(callback: Callback\): void 下载开始前通知给用户,用户需要在此接口中调用WebDownloadItem.start("xxx")并提供下载路径,否则下载会一直处于PENDING状态。 > **说明:** > >处于PENDING状态的下载任务会首先将文件保存至临时目录。在调用WebDownloadItem.start并指定目标路径后,临时文件将被重命名为目标文件名,未完成下载的部分会在调用WebDownloadItem.start并指定目标路径后直接下载到目标路径。若希望避免在调用WebDownloadItem.start前生成临时文件,可先通过WebDownloadItem.cancel来取消当前的下载任务,之后再使用WebDownloadManager.resumeDownload来恢复被取消的下载任务。 **系统能力:** SystemCapability.Web.Webview.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 触发下载的回调。 | **示例:** ```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.info("will start a download."); // 传入一个下载路径,并开始下载。 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.info("download failed guid: " + webDownloadItem.getGuid()); // 序列化失败的下载到一个字节数组。 this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.info("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 下载过程中的回调,通过该回调的参数可以了解下载进度等信息。 **系统能力:** SystemCapability.Web.Webview.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 下载的回调已更新。 | **示例:** ```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.info("will start a download."); // 传入一个下载路径,并开始下载。 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.info("download failed guid: " + webDownloadItem.getGuid()); // 序列化失败的下载到一个字节数组。 this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.info("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 下载完成的通知。 **系统能力:** SystemCapability.Web.Webview.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 下载的回调已完成。 | **示例:** ```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.info("will start a download."); // 传入一个下载路径,并开始下载。 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.info("download failed guid: " + webDownloadItem.getGuid()); // 序列化失败的下载到一个字节数组。 this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.info("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 下载失败的通知。 **系统能力:** SystemCapability.Web.Webview.Core **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------ | ---- | :------------- | | callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 下载回调失败。 | **示例:** ```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.info("will start a download."); // 传入一个下载路径,并开始下载。 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); }) this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); this.download = webDownloadItem; }) this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { console.info("download failed guid: " + webDownloadItem.getGuid()); // 序列化失败的下载到一个字节数组。 this.failedData = webDownloadItem.serialize(); }) this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { console.info("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 }) } } } ```