成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ArkUI request API實現下載進度獲取及顯示

系統 OpenHarmony
我們基于ArkUI-ts來實現一個下載進度條的顯示,以API 8、FA模型為例。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

簡介

在OpenHarmony應用開發中,我們常用兩種方式來實現文件的下載:

  • 使用系統能力SystemCapability.Communication.NetStack(@ohos.http)
  • 使用系統能力SystemCapability.MiscServices.Download(@ohos.request)

區別

  • 前者下載過程信息不可見,后者會在手機狀態欄顯示下載會話,并且可被應用監聽
  • 前者請求下載后不會對文件作進一步處理,后者會直接保存到指定目錄

使用場景

  • 下載大體積文件時監聽進度
  • 文件下載直接到本地保存

文檔傳送門
??HarmonyOS?OpenHarmony

下面,我們基于ArkUI-ts來實現一個下載進度條的顯示,以API 8、FA模型為例。
(API 9接口稍有改動,若使用API 9、Stage模型,請參考官方文檔??OpenHarmony??,但基本的代碼思路是不變的。
變動:

  • 相比于API 8的FA模型,加入了Context的傳參。
  • 增加了uploadFile()、downloadFile()方法,保留upload()、donwload()方法

實現流程

首先配置網絡權限(config.json–>module下添加)。

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

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

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

1、下載配置

導入系統接口。

import request from '@ohos.request'

DownloadConfig

常用的字段配置:

字段

解釋

必填

url

資源目標地址

header

請求頭配置

filePath

資源保存路徑

其它的字段配置:

字段

解釋

必填

title

設置下載會話標題(狀態欄)

description

設置下載會話的描述(狀態欄)

networkType

允許下載的網絡類型:

0x00000001——流量數據

0x00010000——wifi

enableRoaming

是否允許在漫游網絡中下載

enableMetered

允許在按流量計費的連接下下載

示例1

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

let downloadConfig: request.DownloadConfig = {
url: downloadUrl,
filePath: 'myDownload/test.png',
description: 'Download Test',
}

internal://cache是應用沙箱路徑,獲取方法:

import featureAbility from "@ohos.ability.featureAbility"
let cacheSandPath = featureAbility.getConext().getCacheDoir()

目前js api只支持在filePath配置在internal://cache下(默認)
我們有兩種方式可以訪問到下載的文件:一是內部儲存目錄storage路徑file目錄;二是只允許本應用訪問的沙箱路徑cache目錄
這個知識點在后面的Image顯示會用到。

2、創建下載任務

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

3、監聽下載事件

request.DownloadTask

方法

解釋

on/ off(“progress”)

開啟/關閉 進度 監聽,返回當前下載大小receivedSize和總大小totalSize

on / off(‘complete’|‘pause’|‘remove’)

開啟/關閉 完成|暫停|取消 監聽

on / off(‘fail’)

開啟/關閉 失敗 監聽,返回錯誤碼

remove()

移除下載任務,返回boolean值

pause()

暫停下載任務

query()

查詢下載實時情況,返回Promise<DownloadInfo>

queryMimeType()

查詢下載的任務的 MimeType(媒體類型),返回Promise<string>

request.DownloadInfo

屬性

解釋

downloadTotalBytes

下載的文件的總大小(int bytes)

downloadedBytes

實時下載大小(int bytes)

downloadId

下載的文件ID

fileName

下載的文件名

filePath

存儲文件的URI

status

下載狀態代碼

targetURI

下載文件的URI

downloadTitle

下載的文件的標題

description

待下載文件的描述信息

failedReason

下載失敗原因(非必有)

想要實現下載進度的監聽,從上面的方法我們可以找到對應的方法 on(“progress”)。

示例3-1

downloadTask.on('progress', (receiveSize: number, totalSize: number) => {
this.curProgressValue = (receiveSize / totalSize) * 100
this.curTaskDownloadedSize = receiveSize
this.curTaskTotalSize = totalSize
})

經過測試發現,直接使用 on(‘progress’)不一定能監聽到實時下載大小和總大小,返回值receivedSize和totalSize可能為0。

因此當on(“progress”)的返回值為0時,我們可以用另外一個方法 query() 來查詢實時下載中的進度信息,或是在query() 中使用on(‘progress’)。

示例3-2

進度的監聽

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

示例3-3

complete、fail、pause事件的監聽。

downloadTask.query().then((downloadInfo:request.DownloadInfo) => {
......
var self = this
var clearListeners = 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)
})
})

4、下載結果反饋

定義一個Progress組件來顯示當前下載任務的進度(數字和進度條),當下載任務結束后,顯示相關信息:任務成功or失敗、保存的位置。

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

Text顯示相關下載信息。

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

定義Image組件,獲取保存路徑顯示下載的媒體(僅當圖片)。
這里訪問路徑使用的是downloadInfo中的filePath屬性,即內部儲存路徑。

// 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)

同時,可以完美地運用上我在這篇文章 #創作者激勵#【FFH】自制ArkUI組件-文件管理器(二)懸浮小球 封裝好的 文件管理器組件-FilerBall 來檢驗我們文件下載保存的位置,以及查看更詳細的文件信息。

演示圖

下載大文件(視頻)時

![5fd11464c6fc189aeed7ffada375ce2.jpg](?https://dl-harmonyos.51cto.com/images/202303/b8bd32e55db148d6ad99540c9456ddda6d87fd.jpg?x-oss-process=。

借助??FilerBall??組件檢驗

#創作者激勵【FFH】ArkUI request API實現下載進度獲取及顯示-開源基礎軟件社區

這里設置images、video、file都保存在沙箱訪問路徑internal://cache的myDownload/下。

Image回顯

#創作者激勵【FFH】ArkUI request API實現下載進度獲取及顯示-開源基礎軟件社區

代碼

downloadDemo(downloadUrl: string, saveUrl?: string) {
var self = this
var clearListeners = function () {
self.downloadTask.off('progress')
self.downloadTask.off('fail')
self.downloadTask.off('remove')
self.downloadTask.off('complete')
}
let downloadConfig: request.DownloadConfig = {
url: downloadUrl,
filePath: 'myDownload/' + saveUrl,
enableMetered: true,
enableRoaming: true,
description: 'Download Test',
}
request.download(downloadConfig, (err, data) => {
if (err) {
console.info('xxx--- Failed to request the download. Cause: ' + JSON.stringify(err))
return
}
let downloadInfoFilePath
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--- Download task queried. Data:' + JSON.stringify(downloadInfo))
}).catch((err) => {
console.info('xxx--- Failed to query the download task. 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/')
})

頁面代碼放在附件資源。

https://ost.51cto.com/resource/2679。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-12-11 17:15:05

應用開發波紋進度條ArkUI

2024-06-13 08:15:00

2009-07-22 17:13:21

Asp.Net編程

2009-10-14 17:32:24

VB.NET實現下拉列

2022-09-09 14:47:50

CircleArkUI

2012-05-15 10:05:56

WP7 下載進度

2013-07-21 18:27:15

iOS開發ASIHTTPRequ

2013-01-05 13:50:13

AjaxWebASP.NET MVC

2022-02-17 17:05:31

OpenHarmonWEB前端鴻蒙

2010-06-07 16:37:30

rsync 下載

2009-08-27 14:01:41

C#進度條

2022-07-04 16:34:46

流光按鈕Stack

2022-11-02 16:06:54

ArkUIETS

2022-10-24 14:49:54

ArkUI心電圖組件

2015-03-23 18:11:39

UITableViewswift下拉刷新

2017-01-05 09:17:42

科技新聞早報

2022-09-14 15:17:26

ArkUI鴻蒙

2022-07-26 14:40:42

ArkUIJS

2022-08-05 19:27:22

通用API鴻蒙

2022-07-20 15:24:47

ArkUI動畫效果項目開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产激情视频 | 欧美不卡一区 | 黄色av网站在线免费观看 | 欧美一区二区 | 福利网址 | 在线伊人网 | www在线| 一级黄色片日本 | 黄色一级免费看 | 日本一区二区电影 | 国产精品伦一区二区三级视频 | 精品久久久久久亚洲综合网站 | 欧美freesex黑人又粗又大 | 国产最新视频在线 | 欧美激情精品久久久久久 | 日韩一区中文字幕 | 99精品久久久 | 国产超碰人人爽人人做人人爱 | 伊人网综合在线 | www国产精| 精品少妇一区二区三区日产乱码 | 激情欧美一区二区三区中文字幕 | 99综合| 国产精品揄拍一区二区 | 91精品国产欧美一区二区 | 久久久亚洲 | 国产精品美女在线观看 | ww 255hh 在线观看 | 国产又爽又黄的视频 | 国产一区二区免费 | 欧美日韩中文字幕在线 | 免费一区二区三区 | 国产精品国产精品国产专区不片 | 午夜精品一区二区三区免费视频 | 亚洲国产精品久久久久秋霞不卡 | 欧美视频1区| 久久综合狠狠综合久久综合88 | 亚洲视频在线观看 | 久久91av | 日韩在线观看 | 精品国产伦一区二区三区观看说明 |