From 558433a4d514c10729ce0bb3dcbd0b76ae9a6c1a Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Mon, 2 Jun 2025 16:51:26 +0800 Subject: [PATCH 1/9] update Signed-off-by: qianyong325 --- .../UploadAndDownLoad/README_zh.md | 12 +- .../entry/build-profile.json5 | 2 - .../entry/src/main/ets/pages/Download.ets | 130 ++++++++++++++++-- .../src/main/ets/pages/DownloadFiles.ets | 3 +- .../entry/src/main/ets/pages/Index.ets | 17 ++- .../main/resources/base/element/string.json | 12 ++ .../main/resources/en_US/element/string.json | 8 ++ .../main/resources/zh_CN/element/string.json | 8 ++ .../src/main/ets/components/FileBrowse.ets | 7 +- .../src/main/ets/download/RequestDownload.ets | 11 +- .../src/main/ets/utils/FileUtils.ets | 27 ++-- .../UploadAndDownLoad/oh-package.json5 | 1 + .../devices/zh/download_folder_user.jpg | Bin 0 -> 20850 bytes .../screenshots/devices/zh/download_user.jpg | Bin 0 -> 17861 bytes .../screenshots/devices/zh/home.jpg | Bin 11053 -> 16151 bytes 15 files changed, 191 insertions(+), 47 deletions(-) create mode 100644 code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/download_folder_user.jpg create mode 100644 code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/download_user.jpg diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md b/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md index a5e7b5a882..a1df196232 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md @@ -5,15 +5,15 @@ ### 效果预览 -| 主页 | 上传 | 片段上传 | 下载 | 证书锁定 | -| :---------------------------------------: | :---------------------------------------: | :--------------------------------------: | :--------------------------------------: | ---------------------------------------- | -| ![home](screenshots/devices/zh/home.jpg) | ![util](screenshots/devices/zh/upload.jpg) | ![util](screenshots/devices/zh/uploadchunk.jpg) | ![convertxml](screenshots/devices/zh/download.jpg) | ![cert_lock](screenshots/devices/zh/cert_lock.jpg) | +| 主页 | 上传 | 片段上传 | 下载 | 下载到用户目录 | 证书锁定 | +| :---------------------------------------: | :---------------------------------------: | :--------------------------------------: | :--------------------------------------: | :--------------------------------------: | ---------------------------------------- | +| ![home](screenshots/devices/zh/home.jpg) | ![util](screenshots/devices/zh/upload.jpg) | ![util](screenshots/devices/zh/uploadchunk.jpg) | ![convertxml](screenshots/devices/zh/download.jpg) | ![convertxml](screenshots/devices/zh/download_user.jpg) | ![cert_lock](screenshots/devices/zh/cert_lock.jpg) | 使用说明 1.本示例功能需要先配置服务器环境后使用,具体配置见[上传下载服务配置](./environment)。 -2.首页展示上传、下载和证书锁定三个入口组件,点击进入对应的页面,如果要使用后台下载任务,请开启后台任务开关。 +2.首页展示上传、下载、下载到用户目录和证书锁定四个入口组件,点击进入对应的页面,如果要使用后台下载任务,请开启后台任务开关。 3.上传页面: @@ -133,9 +133,9 @@ UploadAndDownload 1.本示例仅支持标准系统上运行,支持设备:RK3568。 -2.本示例为Stage模型,支持API12版本SDK,SDK版本号(API Version 12),镜像版本号(5.0) +2.本示例为Stage模型,支持API20版本SDK,SDK版本号(API Version 20),镜像版本号(6.0) -3.本示例需要使用DevEco Studio 版本号(4.1 Release)及以上版本才可编译运行。 +3.本示例需要使用DevEco Studio 版本号(5.0.5 Release)及以上版本才可编译运行。 4.运行本示例需全程联网。 diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/build-profile.json5 b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/build-profile.json5 index 6ebd7bd06c..74bd2c0878 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/build-profile.json5 +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/build-profile.json5 @@ -20,8 +20,6 @@ "targets": [ { "name": "default" - , - "runtimeOS":"OpenHarmony" } , { diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets index 86f662222d..abc16779a2 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets @@ -27,25 +27,32 @@ import { TOAST_BOTTOM } from '@ohos/uploaddownload'; import { SelectFolderDialog } from '../components/SelectFolderDialog'; +import { common } from '@kit.AbilityKit'; +import { picker } from '@kit.CoreFileKit'; +import { BusinessError } from '@kit.BasicServicesKit'; const TAG: string = 'DownloadSample'; +const userDir: string = 'file://docs/storage/Users/currentUser'; @Entry @Component struct Download { private fileData: CustomDataSource = new CustomDataSource([]); + private documentSelectOptions = new picker.DocumentSelectOptions(); @StorageLink('isBackground') isBackground: boolean = false; @StorageLink('backDownTaskState') backDownTaskState: BackgroundTaskState = BackgroundTaskState.NONE; + @StorageLink('downloadServer') downloadServerStr: string = './'; @Provide downloadFolder: Array = []; @State isGetData: boolean = false; @State checkFile: Array = []; @State checkList: Array = []; @State isRunning: boolean = false; + @State isUserFolder: boolean = true; @State isPause: boolean = false; @State progress: number = 0; private selectFolder = (folder: string) => { logger.info(TAG, `selectFolder = ${folder}`); - this.download(folder); + this.download('./' + folder); } private folderDialogController: CustomDialogController = new CustomDialogController({ builder: SelectFolderDialog({ selectFolder: this.selectFolder }), @@ -53,6 +60,56 @@ struct Download { alignment: DialogAlignment.Bottom, offset: { dx: 0, dy: -12 } }); + async selectUserFolder() { + const documentSaveOptions = new picker.DocumentSaveOptions(); + console.info(TAG, `documentSaveOptions: ${JSON.stringify(documentSaveOptions)}`) + console.info(TAG, `documentSelectOptions: ${JSON.stringify(this.documentSelectOptions)}`) + this.checkFile = []; + if (this.checkList === undefined) { + return; + } + logger.info(TAG, `checkList = ${JSON.stringify(this.checkList)}`); + for (let i = 0; i < this.checkList.length; i++) { + if (this.checkList[i]) { + let fileModel = this.fileData.getData(i); + logger.info(TAG, `fileModel = ${JSON.stringify(fileModel)}`); + fileModel.files.forEach((url: string) => { + let splitUrl = url.split('//')[1].split('/'); + if (splitUrl[splitUrl.length-1] !== '') { + this.checkFile.push(url); + documentSaveOptions.newFileNames = [splitUrl[splitUrl.length-1]]; + } + }); + } + } + + logger.info(TAG, `checkFile = ${JSON.stringify(this.checkFile)}`); + + if (this.checkFile.length === 0) { + promptAction.showToast({ message: $r('app.string.check_file_tips'), bottom: TOAST_BOTTOM }); + return; + } + + console.info(TAG, `documentSaveOptions: ${documentSaveOptions}`) + let context = this.getUIContext().getHostContext() as common.UIAbilityContext; + console.info(TAG, `context: ${JSON.stringify(context)}`) + const documentViewPicker = new picker.DocumentViewPicker(context); + console.info(TAG, `documentViewPicker: ${JSON.stringify(documentViewPicker)}`) + await documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array) => { + console.info(TAG, `documentSaveResult: ${documentSaveResult}`) + let splitUrl = documentSaveResult[0].split('/'); + console.info(TAG, `splitUrl: ${splitUrl}`) + splitUrl.pop(); + console.info(TAG, `splitUrl: ${splitUrl}`) + let splitUrl1=splitUrl.join('/'); + logger.info(TAG, `selectFolder = ${splitUrl1}`); + this.documentSelectOptions.defaultFilePathUri = splitUrl1 + this.download(splitUrl1); + logger.info(TAG, `selectFolder = ${splitUrl1}`); + }).catch((err: BusinessError) => { + console.error(TAG, `code : ${err.code} message : ${err.message}`) + }); + } build() { Navigation() { @@ -91,7 +148,7 @@ struct Download { .mode(NavigationMode.Stack) .backgroundColor($r('app.color.light_gray')) .hideToolBar(false) - .title($r('app.string.download')) + .title(this.isUserFolder?$r('app.string.downloadToUser'):$r('app.string.download')) } @Builder @@ -192,7 +249,7 @@ struct Download { .fontSize(16) .margin({ left: 12 }) } else { - Text($r('app.string.download')) + Text(this.isUserFolder?$r('app.string.downloadToUser'):$r('app.string.download')) .fontColor(Color.White) .fontSize(16) } @@ -203,9 +260,13 @@ struct Download { .height(45) .width('100%') .backgroundColor($r('app.color.button_blue')) - .onClick(() => { + .onClick(async () => { if (!this.isRunning) { - this.folderDialogController.open(); + if (this.isUserFolder ) { + await this.selectUserFolder(); + } else { + this.folderDialogController.open(); + } } }) } @@ -218,9 +279,22 @@ struct Download { .margin({ bottom: 12 }) .fontColor($r('app.color.btn_text_blue')) .onClick(() => { - router.pushUrl({ - url: 'pages/DownloadFiles' - }); + if (this.isUserFolder ) { + let context = this.getUIContext().getHostContext() as common.UIAbilityContext; + console.info(TAG, `context: ${JSON.stringify(context)}`) + const documentViewPicker = new picker.DocumentViewPicker(context); + console.info(TAG, `documentViewPicker: ${JSON.stringify(documentViewPicker)}`) + console.info(TAG, `documentSelectOptions: ${JSON.stringify(this.documentSelectOptions)}`) + documentViewPicker.select(this.documentSelectOptions).then((documentSelectResult: Array) =>{ + console.info(TAG, `documentSelectResult: ${documentSelectResult}`) + }) + } else { + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + AppStorage.setOrCreate('downloadDir', context.cacheDir); + router.pushUrl({ + url: 'pages/DownloadFiles' + }) + } }) } .margin({ top: 12, left: 12, right: 12 }) @@ -231,19 +305,45 @@ struct Download { this.isRunning = false; this.isPause = false; this.isGetData = true; - requestFiles.requestFiles().then((data: FileModel[]) => { + const params = router.getParams(); + console.info(`router.params: ${params}`); + if (params) { + this.isUserFolder=true; this.checkList = []; - this.isRunning = false; - this.fileData.dataArray = data; + this.isRunning = false; + let itemtxt:FileModel = new FileModel('test.txt',false,[this.downloadServerStr + 'test.txt']); + let itemjpg:FileModel = new FileModel('edge_picture.jpg',false,[this.downloadServerStr + 'edge_picture.jpg']); + let itemmp3:FileModel = new FileModel('audio_test.mp3',false,[this.downloadServerStr + 'audio_test.mp3']); + let itemmp4:FileModel = new FileModel('video_media.mp4',false,[this.downloadServerStr + 'video_media.mp4']); + this.fileData.dataArray = [itemtxt,itemjpg,itemmp3,itemmp4] ; this.fileData.dataArray.forEach((item: FileModel) => { + logger.debug(TAG, `item:${JSON.stringify(item)}`); this.checkList.push(false); }) this.isGetData = false; this.fileData.notifyDataReload(); - }) - fileUtils.listFolders().then((folders: Array) => { - this.downloadFolder = folders; - }) + fileUtils.listFolders(userDir).then((folders: Array) => { + logger.debug(TAG, `folders:${JSON.stringify(folders)}`); + this.downloadFolder = folders; + }) + } else { + this.isUserFolder=false; + requestFiles.requestFiles().then((data: FileModel[]) => { + this.checkList = []; + this.isRunning = false; + this.fileData.dataArray = data; + this.fileData.dataArray.forEach((item: FileModel) => { + this.checkList.push(false); + }) + this.isGetData = false; + this.fileData.notifyDataReload(); + }) + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + fileUtils.listFolders(context.cacheDir).then((folders: Array) => { + logger.debug(TAG, `folders:${JSON.stringify(folders)}`); + this.downloadFolder = folders; + }) + } } fileCheck(index: number) { diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/DownloadFiles.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/DownloadFiles.ets index 490bb26612..212b3c24f0 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/DownloadFiles.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/DownloadFiles.ets @@ -18,9 +18,10 @@ import { FileBrowse } from '@ohos/uploaddownload'; @Entry @Component struct DownLoadFiles { + @StorageLink('downloadDir') downloadDir: string = './'; build() { Column() { - FileBrowse() + FileBrowse({downloadDir:this.downloadDir}) } .width('100%') .height('100%') diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets index a2ed4f2e8e..2298d996a8 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets @@ -65,6 +65,11 @@ struct Index { .itemStyle() .margin({ top: 20 }) + TextInput({ text: $r('app.string.downloadServer') }) + .visibility(Visibility.Hidden) + .height(0) + .onChange((downloadServer) => AppStorage.setOrCreate('downloadServer', downloadServer)) + Row() { Text($r('app.string.HFS_tips')) .textStyle() @@ -87,8 +92,18 @@ struct Index { this.CapabilityView($r('app.media.ic_download'), $r('app.string.download'), 'btn_download', () => { router.pushUrl({ url: 'pages/Download' + }) + }) + this.CapabilityView($r('app.media.ic_download'), $r('app.string.downloadToUser'), 'btn_downloadToUser', + () => { + + router.pushUrl({ + url: 'pages/Download', + params: { + action: 'ToUser' + } + }) }) - }) this.CapabilityView($r('app.media.ic_certified'), $r('app.string.cert_lock'), 'btn_cert_lock', () => { router.pushUrl({ url: 'pages/CertLock' diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/base/element/string.json b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/base/element/string.json index f2f3603345..15f5c8c410 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/base/element/string.json +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/base/element/string.json @@ -68,6 +68,18 @@ "name": "download", "value": "Download" }, + { + "name": "downloadToApplication", + "value": "downloadToApplication" + }, + { + "name": "downloadToUser", + "value": "DownloadToUser" + }, + { + "name": "downloadServer", + "value": "https://gitee.com/tiga-ultraman/downloadTests/releases/download/v1.01/" + }, { "name": "download_to", "value": "Select a download location" diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/en_US/element/string.json b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/en_US/element/string.json index 751ab62d30..ab355f1e97 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/en_US/element/string.json +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/en_US/element/string.json @@ -139,6 +139,14 @@ { "name": "cert_lock", "value": "Cert lock" + }, + { + "name": "downloadToUser", + "value": "DownloadToUser" + }, + { + "name": "downloadToApplication", + "value": "DownloadToApplication" } ] } \ No newline at end of file diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/zh_CN/element/string.json b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/zh_CN/element/string.json index 94ea0de964..3e42b66c3f 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/zh_CN/element/string.json +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/resources/zh_CN/element/string.json @@ -139,6 +139,14 @@ { "name": "cert_lock", "value": "证书锁定" + }, + { + "name": "downloadToUser", + "value": "下载到用户目录" + }, + { + "name": "downloadToApplication", + "value": "下载到应用目录" } ] } \ No newline at end of file diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/components/FileBrowse.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/components/FileBrowse.ets index e8fd253d4c..c476c47168 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/components/FileBrowse.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/components/FileBrowse.ets @@ -21,9 +21,10 @@ export struct FileBrowse { @State folders: Array = ['folder']; @State files: Array = []; @State currentFolder: string = ''; + @Link downloadDir: string; aboutToAppear() { - fileUtils.listFolders().then((folders: Array) => { + fileUtils.listFolders(this.downloadDir).then((folders: Array) => { this.folders = folders; }) } @@ -57,7 +58,7 @@ export struct FileBrowse { .onStateChange(async (isActivated: boolean) => { if (isActivated) { this.currentFolder = item; - this.files = await fileUtils.listFiles(item); + this.files = await fileUtils.listFiles(this.downloadDir,item); } }) } @@ -132,7 +133,7 @@ export struct FileBrowse { } .margin({ bottom: 24, top: 6 }) .onClick(() => { - fileUtils.clearFolder(this.currentFolder); + fileUtils.clearFolder(this.downloadDir,this.currentFolder); this.files = []; }) } diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/download/RequestDownload.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/download/RequestDownload.ets index 4c58ce38c6..8e1f1051f3 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/download/RequestDownload.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/download/RequestDownload.ets @@ -99,7 +99,7 @@ class RequestDownload { } async downloadFile(folder: string, url: string, callback: (progress: number, isSuccess: boolean) => void) { - logger.info(TAG, 'downloadFile'); + logger.info(TAG, `downloadFile folder:${folder} url:${url}`); // 查询到存在正在执行的下载任务,提示并返回 let tasks = await request.agent.search({ state: request.agent.State.RUNNING, @@ -111,15 +111,16 @@ class RequestDownload { return; } let splitUrl = url.split('//')[1].split('/'); + let saveas = `${folder}/${splitUrl[splitUrl.length-1]}` let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; let downloadConfig: request.agent.Config = { action: request.agent.Action.DOWNLOAD, url: url, - method: 'POST', + method: 'GET', title: 'download', mode: request.agent.Mode.FOREGROUND, network: request.agent.Network.ANY, - saveas: `./${folder}/${splitUrl[splitUrl.length-1]}`, + saveas: saveas, overwrite: true } logger.info(TAG, `downloadFile, downloadConfig = ${JSON.stringify(downloadConfig)}`); @@ -142,7 +143,8 @@ class RequestDownload { this.downloadTask.on('failed', async (progress: request.agent.Progress) => { if (this.downloadTask) { let taskInfo = await request.agent.show(this.downloadTask.tid); - logger.info(TAG, `fail, resean = ${taskInfo.reason}, faults = ${JSON.stringify(taskInfo.faults)}`); + logger.error(TAG, `fail, resean = ${taskInfo.reason}, faults = ${JSON.stringify(taskInfo.faults)}`); + promptAction.showToast({ message: `fail, resean = ${taskInfo.reason}, faults = ${JSON.stringify(taskInfo.faults)}`, bottom: TOAST_BOTTOM }); } callback(100, false); this.deleteTask(); @@ -150,6 +152,7 @@ class RequestDownload { await this.downloadTask.start(); } catch (err) { logger.error(TAG, `task err, err = ${JSON.stringify(err)}`); + promptAction.showToast({ message: JSON.stringify(err), bottom: TOAST_BOTTOM }); callback(100, false); } } diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/utils/FileUtils.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/utils/FileUtils.ets index 44e0ed2ac7..f97ad290bb 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/utils/FileUtils.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/features/uploadanddownload/src/main/ets/utils/FileUtils.ets @@ -24,41 +24,38 @@ class FileUtil { constructor() { } - async initDownloadDir(): Promise { - let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; - logger.info(TAG, `initDownloadDir cacheDir=${context.cacheDir}`); + async initDownloadDir(downloadDir: string): Promise { + logger.info(TAG, `initDownloadDir downloadDir=${downloadDir}`); try { - fs.mkdirSync(`${context.cacheDir}/${ALBUMS[0]}`); - fs.mkdirSync(`${context.cacheDir}/${ALBUMS[1]}`); - fs.mkdirSync(`${context.cacheDir}/${ALBUMS[2]}`); + fs.mkdirSync(`${downloadDir}/${ALBUMS[0]}`); + fs.mkdirSync(`${downloadDir}/${ALBUMS[1]}`); + fs.mkdirSync(`${downloadDir}/${ALBUMS[2]}`); } catch (err) { logger.info(TAG, `initDownloadDir err =${JSON.stringify(err)}`); } } - async listFolders(): Promise> { - await this.initDownloadDir(); + async listFolders(downloadDir: string): Promise> { + await this.initDownloadDir(downloadDir); return ALBUMS; } - async clearFolder(folderName: string): Promise { - let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + async clearFolder(downloadDir: string,folderName: string): Promise { try { - let files: string[] = fs.listFileSync(`${context.cacheDir}/${folderName}`); + let files: string[] = fs.listFileSync(`${downloadDir}/${folderName}`); logger.info(TAG, `listFiles listFileSync =${JSON.stringify(files)}`); for (let i = 0; i < files.length; i++) { - fs.unlinkSync(`${context.cacheDir}/${folderName}/${files[i]}`); + fs.unlinkSync(`${downloadDir}/${folderName}/${files[i]}`); } } catch (err) { logger.info(TAG, `listFiles err =${JSON.stringify(err)}`); } } - async listFiles(folderName: string): Promise> { - let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + async listFiles(downloadDir:string,folderName: string): Promise> { let files: string[] = []; try { - files = fs.listFileSync(`${context.cacheDir}/${folderName}`); + files = fs.listFileSync(`${downloadDir}/${folderName}`); logger.info(TAG, `listFiles listFileSync =${JSON.stringify(files)}`); } catch (err) { logger.info(TAG, `listFiles err =${JSON.stringify(err)}`); diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/oh-package.json5 b/code/BasicFeature/Connectivity/UploadAndDownLoad/oh-package.json5 index 5e3779b038..f301b51451 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/oh-package.json5 +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/oh-package.json5 @@ -14,6 +14,7 @@ */ { + "modelVersion": "5.0.5", "license": "", "devDependencies": { "@ohos/hypium": "1.0.6" diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/download_folder_user.jpg b/code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/download_folder_user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b76f9a7d8942e84f8d0fe734883e15cf2b27bfec GIT binary patch literal 20850 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 literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/download_user.jpg b/code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/download_user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0035e0aca52877a90ea2ef6fe90d716daf599404 GIT binary patch literal 17861 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 R>l(qo7R&#Q`-t%4{|n?m(9-|_ literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/home.jpg b/code/BasicFeature/Connectivity/UploadAndDownLoad/screenshots/devices/zh/home.jpg index e19c858103eda3d17307bbed6d3a9558f8a780c9..8f143b1be64d7d3dd3d0cf5b48492582b18bc8a3 100644 GIT binary patch literal 16151 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 bz+MlOY#(nKWT~i(Se@JaZ(mLl!o>duNp-IG literal 11053 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 I;NA3p0Nx6I00000 -- Gitee From 91acca732cb120cabba668756f276432a6e5f089 Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Mon, 2 Jun 2025 09:01:51 +0000 Subject: [PATCH 2/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/build-profile.json5. Signed-off-by: qianyong325 --- .../Connectivity/UploadAndDownLoad/build-profile.json5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/build-profile.json5 b/code/BasicFeature/Connectivity/UploadAndDownLoad/build-profile.json5 index 49dfabaaeb..875dfdc535 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/build-profile.json5 +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/build-profile.json5 @@ -21,8 +21,8 @@ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 12, - "compatibleSdkVersion": 12, + "compileSdkVersion": 20, + "compatibleSdkVersion": 20, "runtimeOS": "OpenHarmony" } ] -- Gitee From 69d4bddeb49fd2df6f90cf40d71aeb23b2837146 Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Wed, 4 Jun 2025 05:47:59 +0000 Subject: [PATCH 3/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md. Signed-off-by: qianyong325 --- code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md b/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md index a1df196232..4908277b69 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md @@ -103,9 +103,9 @@ UploadAndDownload * 下载模块 - * 使用[@ohos.request](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-request.md)中API 12接口agent.create创建上传任务,调用@ohos.request中的Task相关接口实现上传任务的创建、取消、进度加载,失败的任务会调用查询接口获取失败原因并打印在日志中,前台下载任务只支持单个文件下载,后台下载任务支持多文件下载。使用[@ohos.file.fs](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-fs.md)完成指定路径的创建和查询已下载的文件。 + * 使用[@ohos.request](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-request.md)中API 12接口agent.create创建上传任务,调用@ohos.request中的Task相关接口实现上传任务的创建、取消、进度加载,失败的任务会调用查询接口获取失败原因并打印在日志中,前台下载任务只支持单个文件下载,后台下载任务支持多文件下载。使用[@ohos.file.fs](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-fs.md)完成指定路径的创建和查询已下载的文件。使用[@ohos.file.picker](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-picker.md)进行用户文件的目录路径选择和查看。 * 源码链接:[RequestDownload.ets](./features/uploadanddownload/src/main/ets/download/RequestDownload.ets),[Download.ets](./entry/src/main/ets/pages/Download.ets),[FileUtils.ets](./features/uploadanddownload/src/main/ets/utils/FileUtils.ets),[FileBrowse.ets](./features/uploadanddownload/src/main/ets/components/FileBrowse.ets) - * 参考接口:[@ohos.request](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-request.md),[@ohos.file.fs](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-fs.md) + * 参考接口:[@ohos.request](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-request.md),[@ohos.file.fs](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-fs.md),[@ohos.file.picker](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-picker.md) * 证书锁定模块 -- Gitee From 6fafd635260d959c32afb0dac59dc990c3ffa496 Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Fri, 6 Jun 2025 02:52:38 +0000 Subject: [PATCH 4/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets. Signed-off-by: qianyong325 --- .../entry/src/main/ets/pages/Download.ets | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets index abc16779a2..46e6cbaf4a 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Download.ets @@ -62,8 +62,8 @@ struct Download { }); async selectUserFolder() { const documentSaveOptions = new picker.DocumentSaveOptions(); - console.info(TAG, `documentSaveOptions: ${JSON.stringify(documentSaveOptions)}`) - console.info(TAG, `documentSelectOptions: ${JSON.stringify(this.documentSelectOptions)}`) + logger.info(TAG, `documentSaveOptions: ${JSON.stringify(documentSaveOptions)}`) + logger.info(TAG, `documentSelectOptions: ${JSON.stringify(this.documentSelectOptions)}`) this.checkFile = []; if (this.checkList === undefined) { return; @@ -90,24 +90,24 @@ struct Download { return; } - console.info(TAG, `documentSaveOptions: ${documentSaveOptions}`) + logger.info(TAG, `documentSaveOptions: ${documentSaveOptions}`) let context = this.getUIContext().getHostContext() as common.UIAbilityContext; - console.info(TAG, `context: ${JSON.stringify(context)}`) + logger.info(TAG, `context: ${JSON.stringify(context)}`) const documentViewPicker = new picker.DocumentViewPicker(context); - console.info(TAG, `documentViewPicker: ${JSON.stringify(documentViewPicker)}`) + logger.info(TAG, `documentViewPicker: ${JSON.stringify(documentViewPicker)}`) await documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array) => { - console.info(TAG, `documentSaveResult: ${documentSaveResult}`) + logger.info(TAG, `documentSaveResult: ${documentSaveResult}`) let splitUrl = documentSaveResult[0].split('/'); - console.info(TAG, `splitUrl: ${splitUrl}`) + logger.info(TAG, `splitUrl: ${splitUrl}`) splitUrl.pop(); - console.info(TAG, `splitUrl: ${splitUrl}`) + logger.info(TAG, `splitUrl: ${splitUrl}`) let splitUrl1=splitUrl.join('/'); logger.info(TAG, `selectFolder = ${splitUrl1}`); this.documentSelectOptions.defaultFilePathUri = splitUrl1 this.download(splitUrl1); logger.info(TAG, `selectFolder = ${splitUrl1}`); }).catch((err: BusinessError) => { - console.error(TAG, `code : ${err.code} message : ${err.message}`) + logger.error(TAG, `code : ${err.code} message : ${err.message}`) }); } @@ -281,12 +281,12 @@ struct Download { .onClick(() => { if (this.isUserFolder ) { let context = this.getUIContext().getHostContext() as common.UIAbilityContext; - console.info(TAG, `context: ${JSON.stringify(context)}`) + logger.info(TAG, `context: ${JSON.stringify(context)}`) const documentViewPicker = new picker.DocumentViewPicker(context); - console.info(TAG, `documentViewPicker: ${JSON.stringify(documentViewPicker)}`) - console.info(TAG, `documentSelectOptions: ${JSON.stringify(this.documentSelectOptions)}`) + logger.info(TAG, `documentViewPicker: ${JSON.stringify(documentViewPicker)}`) + logger.info(TAG, `documentSelectOptions: ${JSON.stringify(this.documentSelectOptions)}`) documentViewPicker.select(this.documentSelectOptions).then((documentSelectResult: Array) =>{ - console.info(TAG, `documentSelectResult: ${documentSelectResult}`) + logger.info(TAG, `documentSelectResult: ${documentSelectResult}`) }) } else { let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; @@ -306,7 +306,7 @@ struct Download { this.isPause = false; this.isGetData = true; const params = router.getParams(); - console.info(`router.params: ${params}`); + logger.info(`router.params: ${params}`); if (params) { this.isUserFolder=true; this.checkList = []; -- Gitee From cafae624727e8eda01ece1319ce0b2fdd10c557f Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Fri, 6 Jun 2025 02:56:34 +0000 Subject: [PATCH 5/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets. Signed-off-by: qianyong325 --- .../entry/src/main/ets/pages/Index.ets | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets index 2298d996a8..467661454e 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets @@ -96,13 +96,16 @@ struct Index { }) this.CapabilityView($r('app.media.ic_download'), $r('app.string.downloadToUser'), 'btn_downloadToUser', () => { - - router.pushUrl({ - url: 'pages/Download', - params: { - action: 'ToUser' - } - }) + if (this.isBackground == false ) { + router.pushUrl({ + url: 'pages/Download', + params: { + action: 'ToUser' + } + }) + } else { + promptAction.showToast({ message: "不支持后台下载到用户目录", duration: 5000 }); + } }) this.CapabilityView($r('app.media.ic_certified'), $r('app.string.cert_lock'), 'btn_cert_lock', () => { router.pushUrl({ -- Gitee From 8adf2144b52adf81b6aa5255cd631ef10ab4555a Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Fri, 6 Jun 2025 02:59:33 +0000 Subject: [PATCH 6/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Upload.ets. Signed-off-by: qianyong325 --- .../UploadAndDownLoad/entry/src/main/ets/pages/Upload.ets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Upload.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Upload.ets index 33bb2eb4ad..d47bf2c71a 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Upload.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Upload.ets @@ -168,7 +168,7 @@ struct Upload { this.progress = 0; let index = this.chunkImgIndex; let fileUris = this.imageList.slice(index); - console.debug(TAG + 'fileuri:' + fileUris); + logger.debug(TAG + 'fileuri:' + fileUris); requestUpload.uploadFileChunk(fileUris, this.chunkParaBegins, this.chunkParaEnds, (progress: number, isSucceed: boolean) => { this.progress = progress; if (this.progress === 100 && isSucceed) { @@ -191,7 +191,7 @@ struct Upload { }); return; } - console.debug(TAG + ':imageList:' + this.imageList); + logger.debug(TAG + ':imageList:' + this.imageList); if (this.isBackground) { AppStorage.setOrCreate('backTaskState', BackgroundTaskState.RUNNING); requestUpload.uploadFilesBackground(this.imageList); -- Gitee From 71a452c807944b8e3064c916a263bc97a29379ec Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Fri, 6 Jun 2025 03:06:32 +0000 Subject: [PATCH 7/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md. Signed-off-by: qianyong325 --- code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md b/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md index 4908277b69..96dda84b85 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/README_zh.md @@ -103,7 +103,7 @@ UploadAndDownload * 下载模块 - * 使用[@ohos.request](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-request.md)中API 12接口agent.create创建上传任务,调用@ohos.request中的Task相关接口实现上传任务的创建、取消、进度加载,失败的任务会调用查询接口获取失败原因并打印在日志中,前台下载任务只支持单个文件下载,后台下载任务支持多文件下载。使用[@ohos.file.fs](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-fs.md)完成指定路径的创建和查询已下载的文件。使用[@ohos.file.picker](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-picker.md)进行用户文件的目录路径选择和查看。 + * 使用[@ohos.request](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-request.md)中API 12接口agent.create创建下载任务,调用@ohos.request中的Task相关接口实现下载任务的创建、取消、进度加载,失败的任务会调用查询接口获取失败原因并打印在日志中,前台下载任务只支持单个文件下载,后台下载任务支持多文件下载,下载到用户目录只支持前台下载。使用[@ohos.file.fs](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-fs.md)完成指定路径的创建和查询已下载的文件。使用[@ohos.file.picker](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-picker.md)进行用户文件的目录路径选择和查看。 * 源码链接:[RequestDownload.ets](./features/uploadanddownload/src/main/ets/download/RequestDownload.ets),[Download.ets](./entry/src/main/ets/pages/Download.ets),[FileUtils.ets](./features/uploadanddownload/src/main/ets/utils/FileUtils.ets),[FileBrowse.ets](./features/uploadanddownload/src/main/ets/components/FileBrowse.ets) * 参考接口:[@ohos.request](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-request.md),[@ohos.file.fs](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-fs.md),[@ohos.file.picker](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-file-picker.md) -- Gitee From ad0911a241c1106b7ebc91eb2c89eac781af8d30 Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Fri, 6 Jun 2025 03:11:24 +0000 Subject: [PATCH 8/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets. Signed-off-by: qianyong325 --- .../UploadAndDownLoad/entry/src/main/ets/pages/Index.ets | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets index 467661454e..5a7c3ba2ca 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets @@ -17,7 +17,8 @@ import notificationManager from '@ohos.notificationManager'; import router from '@ohos.router'; import common from '@ohos.app.ability.common'; import { urlUtils } from '@ohos/uploaddownload'; -import util from '@ohos.util'; +import { promptAction } from '@kit.ArkUI'; + @Styles function itemStyle() { -- Gitee From 114de38a5753c5d51b7b3cd28c24f6a27cc8932c Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Fri, 6 Jun 2025 04:08:59 +0000 Subject: [PATCH 9/9] update code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets. Signed-off-by: qianyong325 --- .../UploadAndDownLoad/entry/src/main/ets/pages/Index.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets index 5a7c3ba2ca..cfcacb8950 100644 --- a/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets +++ b/code/BasicFeature/Connectivity/UploadAndDownLoad/entry/src/main/ets/pages/Index.ets @@ -105,7 +105,7 @@ struct Index { } }) } else { - promptAction.showToast({ message: "不支持后台下载到用户目录", duration: 5000 }); + promptAction.showToast({ message: '不支持后台下载到用户目录', duration: 5000 }); } }) this.CapabilityView($r('app.media.ic_certified'), $r('app.string.cert_lock'), 'btn_cert_lock', () => { -- Gitee