HarmonyOS 鸿蒙Next中我就想实现类似浏览器保存图片的功能,为啥这么复杂?
HarmonyOS 鸿蒙Next中我就想实现类似浏览器保存图片的功能,为啥这么复杂?
就一个很简单的功能,用户选择保存在哪个文件夹,然后把文件下载下来并写入。为啥总报错
```lua
err.code : 13400001, err.message : file operation error set path permission fail, download
代码如下(用了harmony-utils库)
let fileName = `test_easy_${DateUtil.getTodayTime()}.jpg`;
PickerUtil.saveDocumentEasy([fileName]).then(async (paths) => {
let path = paths[0];
const url = 'https://picx.zhimg.com/80/v2-3994a1081d1930cca1f27620f79414c8_720w.jpg?source=2c26e567'
console.log("start download, url = " + url + ", path = " + path + ", uri = " + this.cacheUri)
try {
await request.downloadFile(this.getUIContext().getHostContext(), {
url: url,
filePath: path
})
} catch (err) {
console.error('err.code : ' + err.code + ', err.message : ' + err.message);
}
}).catch((err: BusinessError) => {
this.uriStr = `调用保存文件,异常:\n${JSON.stringify(err)}`;
})
想问一下代码是哪里错了。另外,官网为啥要把简单的事搞这么复杂
更多关于HarmonyOS 鸿蒙Next中我就想实现类似浏览器保存图片的功能,为啥这么复杂?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
从错误代码13400001来看,这是典型的文件权限问题。在HarmonyOS Next中,文件系统访问需要严格遵循沙箱机制和权限管理。以下是关键问题点:
- 权限问题:
- 需要确保在config.json中声明了ohos.permission.WRITE_MEDIA权限
- 对于外部存储访问,还需要申请动态权限
- 路径问题:
- 直接使用Picker返回的path可能不符合HarmonyOS文件API要求
- 建议使用官方推荐的getExternalDownloadDir()获取下载目录
- 下载API使用:
- request.downloadFile需要确保filePath参数是应用沙箱内路径
- 可以先下载到应用缓存目录,再通过FileManager移动到目标位置
建议修改方案:
- 先检查权限声明和申请
- 使用官方文件API构建完整路径:
import fileIO from '@ohos.fileio';
const downloadDir = globalThis.abilityContext.filesDir + '/Download/';
- 分步操作:先下载到临时位置,再移动文件
HarmonyOS的严格权限管理是为了系统安全性,虽然增加了开发复杂度,但能更好地保护用户数据隐私。