HarmonyOS 鸿蒙Next 大文件下载怎么保存到系统相册中

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 大文件下载怎么保存到系统相册中

问一下,我想要下载大的视频文件,使用 request.downloadFile方法,下载后我怎么保存到系统相册

2 回复

当前由于权限收缩的原因 目前保存视频和图片到相册推荐使用 saveButton的安全控件 。

或申请READ/WRITE_IMAGEVIDEO的权限,参考指南: 【 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/declare-permissions-in-acl-V13

下载后用fs以流的形式读写文件,参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/app-file-access-V5#%E4%BB%A5%E6%B5%81%E7%9A%84%E5%BD%A2%E5%BC%8F%E8%AF%BB%E5%86%99%E6%96%87%E4%BB%B6

SaveButton().onClick(async (event:ClickEvent, result:SaveButtonOnClickResult) => {

        if (result == SaveButtonOnClickResult.SUCCESS) {

          try {

            const context = getContext(this);

            //获取video_buff

            let filePath =  context.filesDir + "/test.txt";

             let stat = await  fs.stat(filePath)

            let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);

            let arrayBuffer = new ArrayBuffer(stat.size);

            let readLen  = await fs.read(file.fd,arrayBuffer);

            //获取buff

            let video_buff = buffer.from(arrayBuffer, 0, readLen);

            //获取权限

            let helper = photoAccessHelper.getPhotoAccessHelper(context);

            // onClick触发后10秒内通过createAsset接口创建图片文件,10秒后createAsset权限收回。

            //创建保存路径

            let video_uri = await helper.createAsset(photoAccessHelper.PhotoType.VIDEO, 'mp4');

            // 使用uri打开文件,可以持续写入内容,写入过程不受时间限制

            let file_write = await fs.open(video_uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

            // 写入文件

            await fs.write(file_write.fd, video_buff.buffer);

            // 关闭文件

            await fs.close(file_write.fd);

          } catch (error) {

            console.error("error is "+ JSON.stringify(error));

          }

        }

      })

saveButton参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/savebutton-V5#%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4

httpDownFileGet这个下载看上去是没有问题的,filepath就是视频下载后的沙盒路径,在下载完成complete回调中从filepath读取数据并写入。

沙盒路径需要通过getContext().cacheDir获取,不能通过代码写固定。

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-media-components-video-V5

支持file://路径前缀的字符串,即应用沙箱URI:file://<bundleName>/<sandboxPath>。用于读取应用沙箱路径内的资源。需要保证目录包路径下的文件有可读权限。加上前缀 'file://'

更多关于HarmonyOS 鸿蒙Next 大文件下载怎么保存到系统相册中的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS 鸿蒙Next系统中,将大文件下载并保存到系统相册中,可以按照以下步骤操作:

  1. 下载文件:通过FilePicker或相关API下载大文件到本地,并确保文件保存在应用的沙箱路径下或指定目录(如Download目录)。

  2. 文件处理:如果下载的文件不是图片格式,需要将其转换为图片格式(如JPEG或PNG)。这通常涉及解码原文件、编码为图片格式以及可能的图像压缩步骤。

  3. 保存到相册

    • 使用photoAccessHelper.createAsset方法创建一个新的图片资源。
    • 通过文件I/O操作(如fs.openfs.write等)将转换后的图片数据写入到创建的资产中。
    • 使用photoAccessHelper.showAssetsCreationDialog方法将图片添加到系统相册,此方法需要传入源文件的URI和图片创建配置(如文件名、类型等)。

请注意,如果文件较大,处理过程可能会消耗较多时间和系统资源。同时,picker获取的URI只具有临时权限,若需要持久化保存文件,则需通过FilePicker设置永久授权方式获取持久化权限。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部