HarmonyOS鸿蒙Next中手机设备request.downloadFile下载网络文件保存到公共目录?

HarmonyOS鸿蒙Next中手机设备request.downloadFile下载网络文件保存到公共目录?

使用的是手机设备:我想直接通过接口请求网络资源下载到手机的公共目录,用的picker.DocumentViewPicker去获取公共路径,但是下载的时候报错 路径不可取,是为什么?

是request.downloadFile 配置文件保存地址的时候不能指定公共目录吗?

7 回复

在HarmonyOS系统中,通常应用的数据,包括通过网络下载的文件,都存储在应用的沙盒环境中,这是为了安全和隐私考虑。在您的情况下,使用 request.downloadFile 接口下载文件时,可能默认的保存路径是应用的沙盒目录,而您尝试使用 picker.DocumentViewPicker 获取的公共路径来覆盖这个默认路径,从而引发了路径不可取的错误。

如何解决:

  1. 检查权限 :确保您的应用已经请求了访问公共存储的必要权限。
  2. 使用文件复制API :一种常见的做法是首先使用 request.downloadFile 将文件下载到应用的沙盒目录,然后使用 file.fs.copyfile 等文件复制API将文件从沙盒目录复制到公共目录。
  3. 错误处理 :检查并处理API调用中的错误,确保路径和文件操作正确执行。

您可以尝试解决遇到的问题,并成功地将文件从应用沙盒复制到公共目录。如果问题仍然存在,建议检查API的文档以获取更详细的错误信息或联系技术支持获取帮助。

更多关于HarmonyOS鸿蒙Next中手机设备request.downloadFile下载网络文件保存到公共目录?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


下载的图片没有权限不能直接存储到用户的手机文件中

  1. 可以申请受限权限:一般场景很难申请到该权限
  1. 获取临时权限来处理

使用保存控件-使用安全控件-程序访问控制-安全-系统 - 华为HarmonyOS开发者

保存控件是一种特殊的安全控件,它允许用户通过点击按钮临时获取存储权限,而无需通过权限弹框进行授权确认。

集成保存控件后,当用户点击该控件时,应用会获得10秒内访问媒体库特权接口的授权。这适用于任何需要将文件保存到媒体库的应用场景,例如保存图片或视频等。

  1. 使用文件选择器中转处理文件

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-picker#documentviewpicker

总共分两步

第一步:下载到应用沙盒

// 获取沙盒路径

let filesDir = context.filesDir;

// 下载到沙盒

request.downloadFile(context, {
  url: 'https://example.com/file.jpg',
  filePath: filesDir + '/temp.jpg' // 沙盒内临时文件
}).then((downloadTask: request.DownloadTask) => {
  downloadTask.on('complete', () => {
    console.info('下载完成,开始复制到公共目录');
  });
});

第二部:通过 Picker 选择公共目录并复制文件

import { picker, fileUri } from '@kit.FileKit';

// 使用 Picker 选择目标路径

let documentPicker = new picker.DocumentViewPicker();

documentPicker.select().then((uriList: fileUri.FileUri[]) => {
  if (uriList.length > 0) {
    let destUri = uriList.toString(); // 获取用户选择的公共路径

    // 将沙盒文件复制到公共目录
    fs.copyFile(filesDir + '/temp.jpg', destUri).then(() => {
      console.info('复制到公共目录成功');
    });
  }
});

系统默认下载到app所在的沙盒地址,可以再进行一步操作复制到指定目录

搞定了 ,下载后通过文件操作进行复制到公共目录

在HarmonyOS Next中,使用request.downloadFile下载文件到公共目录需通过ohos.file.fsohos.file.fileuri模块实现。首先获取公共目录路径(如DIR_DOCUMENTS),创建目标文件描述符。下载时指定fileUri参数为沙箱路径,通过fileUri.getUriFromPath转换为可访问的URI。需在module.json5中声明ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA权限。下载完成后使用fs.copyFile将文件从应用沙箱移动到公共目录。

在HarmonyOS Next中,使用request.downloadFile下载文件到公共目录需要注意以下几点:

  1. 权限问题:首先确保在config.json中声明了必要的存储权限:
"reqPermissions": [
  {
    "name": "ohos.permission.READ_MEDIA",
    "reason": "下载文件到公共目录"
  },
  {
    "name": "ohos.permission.WRITE_MEDIA",
    "reason": "下载文件到公共目录"
  }
]
  1. 路径获取方式:建议使用@ohos.file.picker获取公共目录路径,而不是直接硬编码路径。示例代码:
import picker from '@ohos.file.picker';
import request from '@ohos.request';

async function downloadToPublicDir(url: string) {
  try {
    // 获取公共目录路径
    const documentPicker = new picker.DocumentViewPicker();
    const result = await documentPicker.select();
    const uri = result[0];
    
    // 下载文件
    const downloadTask = await request.downloadFile(context, {
      url: url,
      filePath: uri // 使用picker返回的URI
    });
    
    downloadTask.on('progress', (received, total) => {
      console.log(`下载进度: ${(received / total * 100).toFixed(1)}%`);
    });
    
    await downloadTask.on('complete', () => {
      console.log('下载完成');
    });
  } catch (err) {
    console.error(`下载失败: ${err.message}`);
  }
}
  1. 常见错误原因:
  • 未正确获取用户授权
  • 尝试写入系统保护的目录
  • URI格式不正确(应使用picker返回的完整URI)
  • 目标目录不可写(某些公共目录可能需要特定权限)
  1. 替代方案:如果仍遇到问题,可以先将文件下载到应用沙箱目录,再通过fileIo.move接口移动到公共目录。
回到顶部