• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用Web组件的下载能力
2
3## 监听页面触发的下载
4
5通过[setDownloadDelegate()](../reference/apis-arkweb/js-apis-webview.md#setdownloaddelegate11)向Web组件注册一个DownloadDelegate来监听页面触发的下载任务。资源由Web组件来下载,Web组件会通过DownloadDelegate将下载的进度通知给应用。
6
7下面的示例中,在应用的rawfile中创建index.html以及download.html。应用启动后会创建一个Web组件并加载index.html,点击setDownloadDelegate按钮向Web组件注册一个DownloadDelegate,,点击页面里的下载按钮的时候会触发一个下载任务,在DownloadDelegate中可以监听到下载的进度。
8
9```ts
10// xxx.ets
11import web_webview from '@ohos.web.webview'
12import business_error from '@ohos.base'
13
14@Entry
15@Component
16struct WebComponent {
17  controller: web_webview.WebviewController = new web_webview.WebviewController();
18  delegate: web_webview.WebDownloadDelegate = new web_webview.WebDownloadDelegate();
19
20  build() {
21    Column() {
22      Button('setDownloadDelegate')
23        .onClick(() => {
24          try {
25            this.delegate.onBeforeDownload((webDownloadItem: web_webview.WebDownloadItem) => {
26              console.log("will start a download.");
27              // 传入一个下载路径,并开始下载。
28              // 如果传入一个不存在的路径,则会下载到默认/data/storage/el2/base/cache/web/目录。
29              webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName());
30            })
31            this.delegate.onDownloadUpdated((webDownloadItem: web_webview.WebDownloadItem) => {
32              // 下载任务的唯一标识。
33              console.log("download update guid: " + webDownloadItem.getGuid());
34              // 下载的进度。
35              console.log("download update guid: " + webDownloadItem.getPercentComplete());
36              // 当前的下载速度。
37              console.log("download update speed: " + webDownloadItem.getCurrentSpeed())
38            })
39            this.delegate.onDownloadFailed((webDownloadItem: web_webview.WebDownloadItem) => {
40              console.log("download failed guid: " + webDownloadItem.getGuid());
41              // 下载任务失败的错误码。
42              console.log("download failed guid: " + webDownloadItem.getLastErrorCode());
43            })
44            this.delegate.onDownloadFinish((webDownloadItem: web_webview.WebDownloadItem) => {
45              console.log("download finish guid: " + webDownloadItem.getGuid());
46            })
47            this.controller.setDownloadDelegate(this.delegate);
48          } catch (error) {
49            let e:business_error.BusinessError = error as business_error.BusinessError;
50            console.error(`ErrorCode: ${e.code},  Message: ${e.message}`);
51          }
52        })
53      Web({ src: $rawfile('index.html'), controller: this.controller })
54    }
55  }
56}
57```
58加载的html文件。
59```html
60<!-- index.html -->
61<!DOCTYPE html>
62<html>
63<body>
64<a href='./download.html' download='download.html'>下载</a>
65</body>
66</html>
67```
68
69待下载的html文件。
70```html
71<!-- download.html -->
72<!DOCTYPE html>
73<html>
74<body>
75<h1>download test</h1>
76</body>
77</html>
78```
79
80## 使用Web组件发起一个下载任务
81
82使用[startDownload()](../reference/apis-arkweb/js-apis-webview.md#startdownload11)接口发起一个下载。
83Web组件发起的下载会根据当前显示的url以及Web组件默认的Referrer Policy来计算referrer。
84
85  在下面的示例中,先点击setDownloadDelegate按钮向Web注册一个监听类,然后点击startDownload主动发起了一个下载,
86  该下载任务也会通过设置的DownloadDelegate来通知app下载的进度。
87
88```ts
89// xxx.ets
90import web_webview from '@ohos.web.webview'
91import business_error from '@ohos.base'
92
93@Entry
94@Component
95struct WebComponent {
96  controller: web_webview.WebviewController = new web_webview.WebviewController();
97  delegate: web_webview.WebDownloadDelegate = new web_webview.WebDownloadDelegate();
98
99  build() {
100    Column() {
101      Button('setDownloadDelegate')
102        .onClick(() => {
103          try {
104            this.delegate.onBeforeDownload((webDownloadItem: web_webview.WebDownloadItem) => {
105              console.log("will start a download.");
106              // 传入一个下载路径,并开始下载。
107              webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName());
108            })
109            this.delegate.onDownloadUpdated((webDownloadItem: web_webview.WebDownloadItem) => {
110              console.log("download update guid: " + webDownloadItem.getGuid());
111            })
112            this.delegate.onDownloadFailed((webDownloadItem: web_webview.WebDownloadItem) => {
113              console.log("download failed guid: " + webDownloadItem.getGuid());
114            })
115            this.delegate.onDownloadFinish((webDownloadItem: web_webview.WebDownloadItem) => {
116              console.log("download finish guid: " + webDownloadItem.getGuid());
117            })
118            this.controller.setDownloadDelegate(this.delegate);
119          } catch (error) {
120            let e:business_error.BusinessError = error as business_error.BusinessError;
121            console.error(`ErrorCode: ${e.code},  Message: ${e.message}`);
122          }
123        })
124      Button('startDownload')
125        .onClick(() => {
126          try {
127            // 这里指定下载地址为 https://www.example.com/,Web组件会发起一个下载任务将该页面下载下来。
128            // 开发者需要替换为自己想要下载的内容的地址。
129            this.controller.startDownload('https://www.example.com/');
130          } catch (error) {
131            let e:business_error.BusinessError = error as business_error.BusinessError;
132            console.error(`ErrorCode: ${e.code},  Message: ${e.message}`);
133          }
134        })
135      Web({ src: 'www.example.com', controller: this.controller })
136    }
137  }
138}
139```