鴻蒙網(wǎng)絡(luò)編程系列38-Web組件文件下載示例

1. web組件文件下載能力簡介

在本系列的第22篇文章拘央,介紹了web組件的文件上傳能力,同樣的书在,web組件也具備文件下載能力灰伟,鴻蒙API提供了處理web組件下載事件的委托類型WebDownloadDelegate,該類型包括四個下載事件的回調(diào)接口:

class WebDownloadDelegate {
//下載開始前通知用戶儒旬,用戶需要在此接口中調(diào)用WebDownloadItem.start提供下載路徑
onBeforeDownload(callback: Callback<WebDownloadItem>): void

//下載過程中的回調(diào)
onDownloadUpdated(callback: Callback<WebDownloadItem>): void

//下載完成后的回調(diào)
onDownloadFinish(callback: Callback<WebDownloadItem>): void

//下載失敗時的回調(diào)
onDownloadFailed(callback: Callback<WebDownloadItem>): void
}

web組件的控制器類WebviewController提供了設(shè)置web組件下載事件委托的方法setDownloadDelegate:

setDownloadDelegate(delegate: WebDownloadDelegate): void

web組件在下載狀態(tài)變化時會自動調(diào)用委托中的對應(yīng)回調(diào)函數(shù)栏账。

本文將通過一個示例演示web組件的下載能力,通過進度條展示下載進度的變化栈源。

2. web組件文件下載演示

本示例運行后的界面如圖所示:

image.png

輸入要瀏覽的網(wǎng)頁地址挡爵,然后單擊“加載”按鈕加載網(wǎng)頁,加載成功后單擊要下載文件的超鏈接即可開始下載凉翻,如圖所示:

image.png

這里我們下載的是嗶哩嗶哩網(wǎng)站的安卓版客戶端了讨,在應(yīng)用的下載展示了下載的位置和當前的進度以及下載速度捻激。下載完畢的界面如圖所示:

image.png

這樣就完成了web組件的下載功能演示。

3. web組件文件下載示例編寫

下面詳細介紹創(chuàng)建該示例的步驟前计。

步驟1:創(chuàng)建Empty Ability項目胞谭。

步驟2:在module.json5配置文件加上對權(quán)限的聲明:

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]

這里添加了訪問互聯(lián)網(wǎng)的權(quán)限。

步驟3:在Index.ets文件里添加如下的代碼:

import webview from '@ohos.web.webview';
import web_webview from '@ohos.web.webview'

@Entry
@Component
struct Index {
  @State title: string = "Web組件文件下載示例"
  //下載狀態(tài)
  @State downloadState: string = ""
  //當前下載速度
  @State downloadSpeed: string = ""
  //下載文件保存位置
  @State downloadPath: string = ""
  //下載進度
  @State downloadProgress: number = 0
  //要加載的網(wǎng)址
  @State webUrl: string = ""

  scroller: Scroller = new Scroller()
  controller: web_webview.WebviewController = new web_webview.WebviewController()

  build() {
    Row() {
      Column() {
        Text(this.title)
          .fontSize(14)
          .fontWeight(FontWeight.Bold)
          .width('100%')
          .textAlign(TextAlign.Center)
          .padding(10)

        Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
          Text("網(wǎng)址:")
            .fontSize(14)
            .width(50)
            .flexGrow(0)

          TextInput({ text: this.webUrl })
            .onChange((value) => {
              this.webUrl = value
            })
            .width(110)
            .fontSize(11)
            .flexGrow(1)

          Button("加載")
            .onClick(() => {
              this.controller.loadUrl(this.webUrl);
              this.controller.setDownloadDelegate(this.buildDownloadDelegate())
            })
            .width(60)
            .fontSize(14)
            .flexGrow(0)
        }
        .width('100%')
        .padding(5)

        Scroll(this.scroller) {
          Web({ src: "", controller: this.controller })
            .padding(10)
            .width('100%')
            .textZoomRatio(150)
            .backgroundColor(0xeeeeee)
        }
        .align(Alignment.Top)
        .backgroundColor(0xeeeeee)
        .height(300)
        .flexGrow(1)
        .scrollable(ScrollDirection.Vertical)
        .scrollBar(BarState.On)
        .scrollBarWidth(20)

        Progress({ total: 100, type: ProgressType.Linear, value: this.downloadProgress })
        Text(this.downloadPath)
          .fontSize(11)
          .width('100%')
          .padding(5)
        Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
          Text(this.downloadState)
            .fontSize(11)
          Divider().vertical(true).height(15).width(10)
          Text(this.downloadSpeed)
            .fontSize(11)
        }
        .width('100%')
        .padding(5)
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)
      .height('100%')
    }
    .height('100%')
  }

  //創(chuàng)建web組件下載狀態(tài)回調(diào)的委托
  buildDownloadDelegate() {
    let downloadDelegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate();
    //下載前的回調(diào)
    downloadDelegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => {
      //下載文件保存位置
      let localFilePath = getContext(this).cacheDir + "/" + webDownloadItem.getSuggestedFileName()
      webDownloadItem.start(localFilePath);
      this.downloadState = "開始下載"
      this.downloadPath = `保存位置:${localFilePath}`
    })

    //下載過程中的通知
    downloadDelegate.onDownloadUpdated((webDownloadItem: webview.WebDownloadItem) => {
      this.downloadState = "正在下載"
      this.downloadProgress = webDownloadItem.getPercentComplete()
      this.downloadSpeed = `當前下載速度:${webDownloadItem.getCurrentSpeed()}比特/秒`
    })

    //下載失敗的通知
    downloadDelegate.onDownloadFailed(() => {
      this.downloadState = `下載失敗`
    })

    //下載完成的通知
    downloadDelegate.onDownloadFinish(() => {
      this.downloadState = "下載完成"
    })

    return downloadDelegate
  }
}

步驟4:編譯運行男杈,可以使用模擬器或者真機丈屹。

步驟5:按照本節(jié)第2部分“web組件文件下載演示”操作即可。

4. 代碼分析

本示例關(guān)鍵點在于構(gòu)造web組件的下載委托伶棒,通過委托的onBeforeDownload回調(diào)設(shè)置下載文件的保存位置旺垒,并通過webDownloadItem的start方法開始下載。

    downloadDelegate.onBeforeDownload((webDownloadItem: webview.WebDownloadItem) => {
      //下載文件保存位置
      let localFilePath = getContext(this).cacheDir + "/" + webDownloadItem.getSuggestedFileName()
      webDownloadItem.start(localFilePath);
      this.downloadState = "開始下載"
      this.downloadPath = `保存位置:${localFilePath}`
    })

(本文作者原創(chuàng)肤无,除非明確授權(quán)禁止轉(zhuǎn)載)

本文源碼地址:
https://gitee.com/zl3624/harmonyos_network_samples/tree/master/code/web/DownloadInWeb

本系列源碼地址:
https://gitee.com/zl3624/harmonyos_network_samples

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末先蒋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宛渐,更是在濱河造成了極大的恐慌竞漾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窥翩,死亡現(xiàn)場離奇詭異业岁,居然都是意外死亡,警方通過查閱死者的電腦和手機寇蚊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門笔时,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仗岸,你說我怎么就攤上這事允耿。” “怎么了爹梁?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵右犹,是天一觀的道長提澎。 經(jīng)常有香客問我姚垃,道長,這世上最難降的妖魔是什么盼忌? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任积糯,我火速辦了婚禮,結(jié)果婚禮上谦纱,老公的妹妹穿的比我還像新娘看成。我一直安慰自己,他們只是感情好跨嘉,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布川慌。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梦重。 梳的紋絲不亂的頭發(fā)上兑燥,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音琴拧,去河邊找鬼降瞳。 笑死,一個胖子當著我的面吹牛蚓胸,可吹牛的內(nèi)容都是我干的挣饥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼沛膳,長吁一口氣:“原來是場噩夢啊……” “哼扔枫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锹安,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茧吊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后八毯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搓侄,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年话速,在試婚紗的時候發(fā)現(xiàn)自己被綠了讶踪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡泊交,死狀恐怖乳讥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情廓俭,我是刑警寧澤云石,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站研乒,受9級特大地震影響汹忠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雹熬,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一宽菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竿报,春花似錦铅乡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽花履。三九已至,卻和暖如春挚赊,著一層夾襖步出監(jiān)牢的瞬間臭挽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工咬腕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欢峰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓涨共,卻偏偏與公主長得像纽帖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子举反,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容