RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于ArkUI request API實(shí)現(xiàn)下載進(jìn)度獲取及顯示

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 2023-04-04 16:53 ? 次閱讀

本文基于 ArkUI request API 實(shí)現(xiàn)下載進(jìn)度獲取及顯示。

鴻蒙應(yīng)用開發(fā)中,我們常用兩種方式來實(shí)現(xiàn)文件的下載:

使用系統(tǒng)能力:

SystemCapability.Communication.NetStack(@ohos.http)
使用系統(tǒng)能力:
SystemCapability.MiscServices.Download(@ohos.request)
區(qū)別如下:前者下載過程信息不可見,后者會(huì)在手機(jī)狀態(tài)欄顯示下載會(huì)話,并且可被應(yīng)用監(jiān)聽;前者請(qǐng)求下載后不會(huì)對(duì)文件作進(jìn)一步處理,后者會(huì)直接保存到指定目錄。

使用場(chǎng)景如下:

下載大體積文件時(shí)監(jiān)聽進(jìn)度

文件下載直接到本地保存

文檔傳送門:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-request-0000001333800457

https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/apis/js-apis-request.md/
下面,我們基于 ArkUI-ts 來實(shí)現(xiàn)一個(gè)下載進(jìn)度條的顯示,以 API 8、FA 模型為例。

API 9 接口稍有改動(dòng),若使用 API 9、Stage 模型,請(qǐng)參考官方文檔OpenHarmony,但基本的代碼思路是不變的。

https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/apis/js-apis-request.md/
變動(dòng):相比于 API 8 的 FA 模型,加入了 Context 的傳參;增加了uploadFile()、downloadFile() 方法,保留 upload()、donwload() 方法。

實(shí)現(xiàn)流程

首先配置網(wǎng)絡(luò)權(quán)限(config.json–>module 下添加):

"reqPermissions":[
{
"name":"ohos.permission.INTERNET"
}
],

支持 http(config.json 下添加):

"deviceConfig":{
"default":{
"network":{
"cleartextTraffic":true
}
}
},

①下載配置

導(dǎo)入系統(tǒng)接口:

importrequestfrom'@ohos.request'
DownloadConfig

常用的字段配置:

2eedbac0-d12a-11ed-bfe3-dac502259ad0.png

其它的字段配置:

2f01fd5a-d12a-11ed-bfe3-dac502259ad0.png

示例 1:例如通過圖片 url 下載保存到本地的 internal://cache 的 myDownload/test.png 路徑,文件名為 test.png。

letdownloadConfig:request.DownloadConfig={
url:downloadUrl,
filePath:'myDownload/test.png',
description:'DownloadTest',
}

internal://cache 是應(yīng)用沙箱路徑,獲取方法:

importfeatureAbilityfrom"@ohos.ability.featureAbility"
letcacheSandPath=featureAbility.getConext().getCacheDoir()
目前 js api 只支持在 filePath 配置在 internal://cache 下(默認(rèn))。 我們有兩種方式可以訪問到下載的文件:一是內(nèi)部儲(chǔ)存目錄 storage 路徑 file 目錄;二是只允許本應(yīng)用訪問的沙箱路徑 cache 目錄。 這個(gè)知識(shí)點(diǎn)在后面的 Image 顯示會(huì)用到。

②創(chuàng)建下載任務(wù)

letdownloadTask
request.download(downloadConfig,(err,data)=>{
if(err){
console.info('xxx---Failedtorequestthedownload.Cause:'+JSON.stringify(err))
return
}
downloadTask=data
})

③監(jiān)聽下載事件

request.DownloadTask:

2f1c4502-d12a-11ed-bfe3-dac502259ad0.png

request.DownloadInfo:

2f4e439a-d12a-11ed-bfe3-dac502259ad0.png

想要實(shí)現(xiàn)下載進(jìn)度的監(jiān)聽,從上面的方法我們可以找到對(duì)應(yīng)的方法 on(“progress”)。

示例 3-1

downloadTask.on('progress',(receiveSize:number,totalSize:number)=>{
this.curProgressValue=(receiveSize/totalSize)*100
this.curTaskDownloadedSize=receiveSize
this.curTaskTotalSize=totalSize
})
經(jīng)過測(cè)試發(fā)現(xiàn),直接使用 on(‘progress’) 不一定能監(jiān)聽到實(shí)時(shí)下載大小和總大小,返回值 receivedSize 和 totalSize 可能為 0。 因此當(dāng) on(“progress”) 的返回值為 0 時(shí),我們可以用另外一個(gè)方法 query() 來查詢實(shí)時(shí)下載中的進(jìn)度信息,或是在 query() 中使用 on(‘progress’)。 示例 3-2

進(jìn)度的監(jiān)聽:

letdownloadInfoFilePath:string=''
downloadTask.query().then((downloadInfo:request.DownloadInfo)=>{
downloadInfoFilePath=downloadInfo.filePath//此處返回的路徑不同于應(yīng)用沙箱路徑
this.downloadTask=data
this.downloadTask.on('progress',(receiveSize:number,totalSize:number)=>{
this.curProgressValue=(receiveSize/totalSize)*100//進(jìn)度條Progress屬性值
this.curTaskDownloadedSize=receiveSize//實(shí)時(shí)下載大小
this.curTaskTotalSize=totalSize//總大小
})
/*或使用query返回的downloadInfo獲取下載進(jìn)度信息
this.curTaskDownloadedSize=downloadInfo.downloadedBytes
this.curTaskTotalSize=downloadInfo.downloadTotalBytes
this.curProgressValue=(this.curTaskDownloadedSize/this.curTaskTotalSize)*100
*/
console.info('xxx---downloadTaskqueriedinfo:'+JSON.stringify(downloadInfo))
}).catch((err)=>{
console.info('xxx---FailedtoquerythedownloadTask:'+JSON.stringify(err))
})
示例 3-3

complete、fail、pause 事件的監(jiān)聽:

downloadTask.query().then((downloadInfo:request.DownloadInfo)=>{
......
varself=this
varclearListeners=function(){
self.downloadTask.off('progress')
self.downloadTask.off('fail')
self.downloadTask.off('remove')
self.downloadTask.off('complete')
}
this.downloadTask.on('fail',(err)=>{
clearListeners()
this.curProgressValue=0
})
this.downloadTask.on('remove',()=>{
clearListeners()
this.curProgressValue=0
})
this.downloadTask.on('complete',()=>{
clearListeners()
this.curProgressValue=100
//downloadInfoList:string[]保存下載歷史的路徑
this.downloadInfoList.push(downloadInfoFilePath)
})
})

④下載結(jié)果反饋

定義一個(gè) Progress 組件來顯示當(dāng)前下載任務(wù)的進(jìn)度(數(shù)字和進(jìn)度條),當(dāng)下載任務(wù)結(jié)束后,顯示相關(guān)信息:任務(wù)成功 or 失敗、保存的位置。

Progress({value:this.curProgressValue})
.width('90%')
.color(Color.Blue)
.margin(10)

Text 顯示相關(guān)下載信息:

Text('實(shí)時(shí)下載大小:'+this.curTaskDownloadedSize+'B').width('90%').fontSize(25).margin(10)
Text('當(dāng)前任務(wù)大小:'+this.curTaskTotalSize+'B').width('90%').fontSize(25).margin(10)
Text('下載儲(chǔ)存路徑:').width('90%').fontSize(25).margin({left:10,right:10,top:10,bottom:5})

定義 Image 組件,獲取保存路徑顯示下載的媒體(僅當(dāng)圖片)。

這里訪問路徑使用的是 downloadInfo 中的 filePath 屬性,即內(nèi)部儲(chǔ)存路徑。

//downloadInfoList:string[]保存下載歷史的路徑
ForEach(this.downloadInfoList,item=>{
Flex({justifyContent:FlexAlign.Center}){
Image(item)
.backgroundColor('#ccc')
.margin(5)
.width('25%')
.aspectRatio(1)
.alignSelf(ItemAlign.Start)
.objectFit(ImageFit.ScaleDown)
Text(item).fontSize(15).padding(10).width('70%')
}.width('95%')
},item=>item)

同時(shí),可以完美地運(yùn)用上我此前封裝好的文件管理器組件-FilerBall,來檢驗(yàn)我們文件下載保存的位置,以及查看更詳細(xì)的文件信息。

演示圖:

2f67fb8c-d12a-11ed-bfe3-dac502259ad0.jpg

借助FilerBall組件檢驗(yàn):

2f8f9a52-d12a-11ed-bfe3-dac502259ad0.jpg 這里設(shè)置 images、video、file 都保存在沙箱訪問路徑 internal://cache 的 myDownload/ 下。 Image 回顯: 2f988a5e-d12a-11ed-bfe3-dac502259ad0.png

代碼如下:

downloadDemo(downloadUrl:string,saveUrl?:string){
varself=this
varclearListeners=function(){
self.downloadTask.off('progress')
self.downloadTask.off('fail')
self.downloadTask.off('remove')
self.downloadTask.off('complete')
}
letdownloadConfig:request.DownloadConfig={
url:downloadUrl,
filePath:'myDownload/'+saveUrl,
enableMetered:true,
enableRoaming:true,
description:'DownloadTest',
}
request.download(downloadConfig,(err,data)=>{
if(err){
console.info('xxx---Failedtorequestthedownload.Cause:'+JSON.stringify(err))
return
}
letdownloadInfoFilePath
this.curProgressValue=0
this.mes='開始'
this.downloadTask=data
this.downloadTask.query().then((downloadInfo:request.DownloadInfo)=>{
downloadInfoFilePath=downloadInfo.filePath
this.downloadTask.on('progress',(receiveSize:number,totalSize:number)=>{
this.curProgressValue=(receiveSize/totalSize)*100
this.curTaskDownloadedSize=receiveSize
this.curTaskTotalSize=totalSize
})
console.info('xxx---Downloadtaskqueried.Data:'+JSON.stringify(downloadInfo))
}).catch((err)=>{
console.info('xxx---Failedtoquerythedownloadtask.Cause:'+JSON.stringify(err))
})

this.downloadTask.on('fail',(err)=>{
clearListeners()
this.curProgressValue=0
this.mes='失敗'
})
this.downloadTask.on('remove',()=>{
clearListeners()
this.curProgressValue=0
this.mes='取消'
})
this.downloadTask.on('complete',()=>{
clearListeners()
this.curProgressValue=100
this.mes='完成'
//downloadInfoList保存下載歷史的路徑
this.downloadInfoList.push(downloadInfoFilePath)
})
})
}

ets 使用示例:

Button('下載視頻(小)',{type:ButtonType.Capsule})
.width('90%')
.height(50)
.margin(10)
.onClick(()=>{
this.curProgressValue=this.curTaskDownloadedSize=this.curTaskTotalSize=0
this.downloadDemo('https://media.w3.org/2010/05/sintel/trailer.mp4','video/')
})
頁面代碼放在附件資源,請(qǐng)點(diǎn)擊閱讀原文查看。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1499

    瀏覽量

    61959
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    565

    瀏覽量

    24727
  • 應(yīng)用開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    9357
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2339

    瀏覽量

    42805
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3713

    瀏覽量

    16254

原文標(biāo)題:鴻蒙上實(shí)現(xiàn)一個(gè)“下載進(jìn)度條”

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙ArkUI-X跨語言調(diào)用說明:【平臺(tái)橋接開發(fā)指南(Android)BridgePlugin】

    本模塊提供ArkUI端和Android平臺(tái)端消息通信的功能,包括數(shù)據(jù)傳輸、方法調(diào)用和事件調(diào)用。需配套ArkUIAPI使用,ArkUI側(cè)具體用法請(qǐng)參考[Bridge
    的頭像 發(fā)表于 05-22 14:52 ?1153次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b>-X跨語言調(diào)用說明:【平臺(tái)橋接開發(fā)指南(Android)BridgePlugin】

    請(qǐng)問esp32 ota升級(jí)如何獲取更新進(jìn)度?

    所用的是esp32-s2 idf:4.4調(diào)用esp_https_ota API進(jìn)行固件升級(jí),想獲取更新進(jìn)度,但不知道怎么實(shí)現(xiàn),有人做過或者有思路指點(diǎn)一下嗎?
    發(fā)表于 06-14 07:20

    怎么用labview實(shí)現(xiàn)下載程序的進(jìn)度

    怎么用labview實(shí)現(xiàn)下載程序的進(jìn)度
    發(fā)表于 01-12 21:43

    labview 如何實(shí)現(xiàn)復(fù)制文件的同時(shí)獲取復(fù)制進(jìn)度

    如何實(shí)現(xiàn)復(fù)制文件的同時(shí)獲取復(fù)制進(jìn)度哪位大俠實(shí)現(xiàn)了,麻煩指點(diǎn)下,謝謝!
    發(fā)表于 12-27 15:12

    iOS開發(fā)ASIHTTPRequest進(jìn)度追蹤的內(nèi)容介紹

    本文為大家介紹了發(fā)ASIHTTPRequest進(jìn)度追蹤的內(nèi)容,其中包括追蹤單個(gè)request下載進(jìn)度,追蹤一系列request
    發(fā)表于 07-15 07:06

    單片機(jī)用USB實(shí)現(xiàn)下載的原理

      最近研究凌陽的61單片機(jī),可苦于61板是用并口實(shí)現(xiàn)下載,在線調(diào)試??杀救擞玫氖潜咀硬]有并口,每次都找臺(tái)機(jī)下載是件非常的不方便。  于是在網(wǎng)上找了下凌陽單片機(jī)用USB實(shí)現(xiàn)下載的原理,可網(wǎng)上資料
    發(fā)表于 12-02 06:35

    HarmonyOS-API7相對(duì)API6差異主要變更內(nèi)容

    能力。新增一系列公共基礎(chǔ)庫的接口,提供Parcel、URL、編解碼庫的能力。新增其他能力的接口,包括:上傳下載進(jìn)度獲取、定時(shí)服務(wù)、fileIO基礎(chǔ)庫、電池狀態(tài)、背光亮度、分布式設(shè)備列表獲取
    發(fā)表于 02-15 14:35

    OpenHarmony如何獲取到單個(gè)文件復(fù)制時(shí)的進(jìn)度?

    1G,每次我們都只讀取1M長度的數(shù)據(jù)流,那么我們每次都只寫入這1M長度的數(shù)據(jù)流,我們就需要循環(huán)寫入1024次,在此期間不停的獲取此時(shí)新文件的大小與被復(fù)制文件的大小的比例,這樣一來,進(jìn)度的數(shù)據(jù)就實(shí)現(xiàn)
    發(fā)表于 03-29 10:33

    4天帶你上手HarmonyOS ArkUI開發(fā)

    代碼即可實(shí)現(xiàn)界面功能。ArkUI內(nèi)置了豐富而精美的HarmonyOS Design的UI組件和API,可滿足大部分跨端應(yīng)用界面開發(fā)的所需。參與任務(wù)1、點(diǎn)擊閱讀原文鏈接,即刻報(bào)名訓(xùn)練營,學(xué)習(xí)如何用
    發(fā)表于 09-09 14:44

    求助,esp32 ota升級(jí)如何獲取更新進(jìn)度?

    所用的是esp32-s2idf:4.4調(diào)用esp_https_ota API進(jìn)行固件升級(jí),想獲取更新進(jìn)度,但不知道怎么實(shí)現(xiàn),有人做過或者有思路指點(diǎn)一下嗎?
    發(fā)表于 02-14 07:15

    labview論壇-經(jīng)典進(jìn)度顯示源程序下載

    labview論壇-經(jīng)典進(jìn)度顯示源程序
    發(fā)表于 04-13 09:43 ?38次下載
    labview論壇-經(jīng)典<b class='flag-5'>進(jìn)度</b><b class='flag-5'>顯示</b>源程序<b class='flag-5'>下載</b>

    Linux基礎(chǔ)教程之linux wget下載進(jìn)度條變成多行顯示如何解決

    在之前為了 解決Putty客戶端連接到CentOS之后顯示亂碼 的問題,設(shè)置了 LANG=zh_CN.UTF-8 之后,在使用wget下載的時(shí)候,wget下載進(jìn)度條異常,竟然不能在一行
    發(fā)表于 10-31 17:04 ?19次下載

    鴻蒙上安裝按鈕實(shí)現(xiàn)下載、暫停、取消、顯示等操作

    今天給大家分享在鴻蒙上一個(gè)按鈕實(shí)現(xiàn)下載、暫停、取消、顯示下載進(jìn)度操作。
    的頭像 發(fā)表于 01-04 14:32 ?2300次閱讀

    使用OkHttp上傳和下載文件時(shí)顯示進(jìn)度庫使用

    核心進(jìn)展 該庫有助于在使用 OkHttp 上傳和下載文件時(shí)顯示進(jìn)度。 CoreProgress 包括: 使用 OkHttp 下載文件時(shí)的進(jìn)度
    發(fā)表于 03-24 11:17 ?5次下載

    OpenAI API Key獲取與充值教程:助開發(fā)者解鎖GPT-4.0 API

    OpenAI 的 API Key,以及如何使用這個(gè) Key 來調(diào)用 GPT-4.0 API。 第一步:獲取 OpenAI API Key 要開始使用 OpenAI 的服務(wù),你首先需要
    的頭像 發(fā)表于 04-28 16:35 ?1w次閱讀
    OpenAI <b class='flag-5'>API</b> Key<b class='flag-5'>獲取</b>與充值教程:助開發(fā)者解鎖GPT-4.0 <b class='flag-5'>API</b>
    RM新时代网站-首页