1# Class (WebDownloadDelegate) 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @aohui--> 5<!--Designer: @yaomingliu--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9下载任务的状态会通过该类的回调接口通知给用户。 10 11> **说明:** 12> 13> - 本模块首批接口从API version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 14> 15> - 本Class首批接口从API version 11开始支持。 16> 17> - 示例效果请以真机运行为准,当前DevEco Studio预览器不支持。 18 19## 导入模块 20 21```ts 22import { webview } from '@kit.ArkWeb'; 23``` 24 25## onBeforeDownload<sup>11+</sup> 26 27onBeforeDownload(callback: Callback\<WebDownloadItem>): void 28 29下载开始前通知给用户,用户需要在此接口中调用WebDownloadItem.start("xxx")并提供下载路径,否则下载会一直处于PENDING状态。 30 31> **说明:** 32> 33>处于PENDING状态的下载任务会首先将文件保存至临时目录。在调用WebDownloadItem.start并指定目标路径后,临时文件将被重命名为目标文件名,未完成下载的部分会在调用WebDownloadItem.start并指定目标路径后直接下载到目标路径。若希望避免在调用WebDownloadItem.start前生成临时文件,可先通过WebDownloadItem.cancel来取消当前的下载任务,之后再使用WebDownloadManager.resumeDownload来恢复被取消的下载任务。 34 35**系统能力:** SystemCapability.Web.Webview.Core 36 37**参数:** 38 39| 参数名 | 类型 | 必填 | 说明 | 40| ------- | ------ | ---- | :------------- | 41| callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 触发下载的回调。 | 42 43**示例:** 44 45```ts 46// xxx.ets 47import { webview } from '@kit.ArkWeb'; 48import { BusinessError } from '@kit.BasicServicesKit'; 49 50@Entry 51@Component 52struct WebComponent { 53 controller: webview.WebviewController = new webview.WebviewController(); 54 delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); 55 download: webview.WebDownloadItem = new webview.WebDownloadItem(); 56 failedData: Uint8Array = new Uint8Array(); 57 58 build() { 59 Column() { 60 Button('setDownloadDelegate') 61 .onClick(() => { 62 try { 63 this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { 64 console.info("will start a download."); 65 // 传入一个下载路径,并开始下载。 66 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); 67 }) 68 this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { 69 console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); 70 this.download = webDownloadItem; 71 }) 72 this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { 73 console.info("download failed guid: " + webDownloadItem.getGuid()); 74 // 序列化失败的下载到一个字节数组。 75 this.failedData = webDownloadItem.serialize(); 76 }) 77 this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { 78 console.info("download finish guid: " + webDownloadItem.getGuid()); 79 }) 80 this.controller.setDownloadDelegate(this.delegate); 81 } catch (error) { 82 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 83 } 84 }) 85 Button('startDownload') 86 .onClick(() => { 87 try { 88 this.controller.startDownload('https://www.example.com'); 89 } catch (error) { 90 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 91 } 92 }) 93 Button('resumeDownload') 94 .onClick(() => { 95 try { 96 webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); 97 } catch (error) { 98 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 99 } 100 }) 101 Button('cancel') 102 .onClick(() => { 103 try { 104 this.download.cancel(); 105 } catch (error) { 106 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 107 } 108 }) 109 Button('pause') 110 .onClick(() => { 111 try { 112 this.download.pause(); 113 } catch (error) { 114 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 115 } 116 }) 117 Button('resume') 118 .onClick(() => { 119 try { 120 this.download.resume(); 121 } catch (error) { 122 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 123 } 124 }) 125 Web({ src: 'www.example.com', controller: this.controller }) 126 } 127 } 128} 129``` 130 131## onDownloadUpdated<sup>11+</sup> 132 133onDownloadUpdated(callback: Callback\<WebDownloadItem>): void 134 135下载过程中的回调,通过该回调的参数可以了解下载进度等信息。 136 137**系统能力:** SystemCapability.Web.Webview.Core 138 139**参数:** 140 141| 参数名 | 类型 | 必填 | 说明 | 142| ------- | ------ | ---- | :------------- | 143| callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 下载的回调已更新。 | 144 145**示例:** 146 147```ts 148// xxx.ets 149import { webview } from '@kit.ArkWeb'; 150import { BusinessError } from '@kit.BasicServicesKit'; 151 152@Entry 153@Component 154struct WebComponent { 155 controller: webview.WebviewController = new webview.WebviewController(); 156 delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); 157 download: webview.WebDownloadItem = new webview.WebDownloadItem(); 158 failedData: Uint8Array = new Uint8Array(); 159 160 build() { 161 Column() { 162 Button('setDownloadDelegate') 163 .onClick(() => { 164 try { 165 this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { 166 console.info("will start a download."); 167 // 传入一个下载路径,并开始下载。 168 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); 169 }) 170 this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { 171 console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); 172 this.download = webDownloadItem; 173 }) 174 this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { 175 console.info("download failed guid: " + webDownloadItem.getGuid()); 176 // 序列化失败的下载到一个字节数组。 177 this.failedData = webDownloadItem.serialize(); 178 }) 179 this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { 180 console.info("download finish guid: " + webDownloadItem.getGuid()); 181 }) 182 this.controller.setDownloadDelegate(this.delegate); 183 } catch (error) { 184 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 185 } 186 }) 187 Button('startDownload') 188 .onClick(() => { 189 try { 190 this.controller.startDownload('https://www.example.com'); 191 } catch (error) { 192 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 193 } 194 }) 195 Button('resumeDownload') 196 .onClick(() => { 197 try { 198 webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); 199 } catch (error) { 200 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 201 } 202 }) 203 Button('cancel') 204 .onClick(() => { 205 try { 206 this.download.cancel(); 207 } catch (error) { 208 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 209 } 210 }) 211 Button('pause') 212 .onClick(() => { 213 try { 214 this.download.pause(); 215 } catch (error) { 216 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 217 } 218 }) 219 Button('resume') 220 .onClick(() => { 221 try { 222 this.download.resume(); 223 } catch (error) { 224 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 225 } 226 }) 227 Web({ src: 'www.example.com', controller: this.controller }) 228 } 229 } 230} 231``` 232 233## onDownloadFinish<sup>11+</sup> 234 235onDownloadFinish(callback: Callback\<WebDownloadItem>): void 236 237下载完成的通知。 238 239**系统能力:** SystemCapability.Web.Webview.Core 240 241**参数:** 242 243| 参数名 | 类型 | 必填 | 说明 | 244| ------- | ------ | ---- | :------------- | 245| callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 下载的回调已完成。 | 246 247**示例:** 248 249```ts 250// xxx.ets 251import { webview } from '@kit.ArkWeb'; 252import { BusinessError } from '@kit.BasicServicesKit'; 253 254@Entry 255@Component 256struct WebComponent { 257 controller: webview.WebviewController = new webview.WebviewController(); 258 delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); 259 download: webview.WebDownloadItem = new webview.WebDownloadItem(); 260 failedData: Uint8Array = new Uint8Array(); 261 262 build() { 263 Column() { 264 Button('setDownloadDelegate') 265 .onClick(() => { 266 try { 267 this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { 268 console.info("will start a download."); 269 // 传入一个下载路径,并开始下载。 270 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); 271 }) 272 this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { 273 console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); 274 this.download = webDownloadItem; 275 }) 276 this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { 277 console.info("download failed guid: " + webDownloadItem.getGuid()); 278 // 序列化失败的下载到一个字节数组。 279 this.failedData = webDownloadItem.serialize(); 280 }) 281 this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { 282 console.info("download finish guid: " + webDownloadItem.getGuid()); 283 }) 284 this.controller.setDownloadDelegate(this.delegate); 285 } catch (error) { 286 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 287 } 288 }) 289 Button('startDownload') 290 .onClick(() => { 291 try { 292 this.controller.startDownload('https://www.example.com'); 293 } catch (error) { 294 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 295 } 296 }) 297 Button('resumeDownload') 298 .onClick(() => { 299 try { 300 webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); 301 } catch (error) { 302 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 303 } 304 }) 305 Button('cancel') 306 .onClick(() => { 307 try { 308 this.download.cancel(); 309 } catch (error) { 310 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 311 } 312 }) 313 Button('pause') 314 .onClick(() => { 315 try { 316 this.download.pause(); 317 } catch (error) { 318 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 319 } 320 }) 321 Button('resume') 322 .onClick(() => { 323 try { 324 this.download.resume(); 325 } catch (error) { 326 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 327 } 328 }) 329 Web({ src: 'www.example.com', controller: this.controller }) 330 } 331 } 332} 333``` 334 335## onDownloadFailed<sup>11+</sup> 336 337onDownloadFailed(callback: Callback\<WebDownloadItem>): void 338 339下载失败的通知。 340 341**系统能力:** SystemCapability.Web.Webview.Core 342 343**参数:** 344 345| 参数名 | 类型 | 必填 | 说明 | 346| ------- | ------ | ---- | :------------- | 347| callback | Callback\<[WebDownloadItem](./arkts-apis-webview-WebDownloadItem.md)> | 是 | 下载回调失败。 | 348 349**示例:** 350 351```ts 352// xxx.ets 353import { webview } from '@kit.ArkWeb'; 354import { BusinessError } from '@kit.BasicServicesKit'; 355 356@Entry 357@Component 358struct WebComponent { 359 controller: webview.WebviewController = new webview.WebviewController(); 360 delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); 361 download: webview.WebDownloadItem = new webview.WebDownloadItem(); 362 failedData: Uint8Array = new Uint8Array(); 363 364 build() { 365 Column() { 366 Button('setDownloadDelegate') 367 .onClick(() => { 368 try { 369 this.delegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => { 370 console.info("will start a download."); 371 // 传入一个下载路径,并开始下载。 372 webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName()); 373 }) 374 this.delegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => { 375 console.info("download update percent complete: " + webDownloadItem.getPercentComplete()); 376 this.download = webDownloadItem; 377 }) 378 this.delegate.onDownloadFailed((webDownloadItem: webview.WebDownloadItem) => { 379 console.info("download failed guid: " + webDownloadItem.getGuid()); 380 // 序列化失败的下载到一个字节数组。 381 this.failedData = webDownloadItem.serialize(); 382 }) 383 this.delegate.onDownloadFinish((webDownloadItem: webview.WebDownloadItem) => { 384 console.info("download finish guid: " + webDownloadItem.getGuid()); 385 }) 386 this.controller.setDownloadDelegate(this.delegate); 387 } catch (error) { 388 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 389 } 390 }) 391 Button('startDownload') 392 .onClick(() => { 393 try { 394 this.controller.startDownload('https://www.example.com'); 395 } catch (error) { 396 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 397 } 398 }) 399 Button('resumeDownload') 400 .onClick(() => { 401 try { 402 webview.WebDownloadManager.resumeDownload(webview.WebDownloadItem.deserialize(this.failedData)); 403 } catch (error) { 404 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 405 } 406 }) 407 Button('cancel') 408 .onClick(() => { 409 try { 410 this.download.cancel(); 411 } catch (error) { 412 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 413 } 414 }) 415 Button('pause') 416 .onClick(() => { 417 try { 418 this.download.pause(); 419 } catch (error) { 420 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 421 } 422 }) 423 Button('resume') 424 .onClick(() => { 425 try { 426 this.download.resume(); 427 } catch (error) { 428 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 429 } 430 }) 431 Web({ src: 'www.example.com', controller: this.controller }) 432 } 433 } 434} 435```