uni.downloadFile 默认存临时路径,不可靠;需用 plus.downloader 指定 file:// 路径(仅5+ App)或 plus.io.copyFile 复制到 documentsDirectory(跨平台沙盒);H5 下无法控制路径,依赖浏览器默认行为。

不能直接修改 uni.downloadFile 的默认存储目录,它固定写入临时缓存路径;要控制最终落盘位置,必须用 plus.downloader 或 plus.io 配合手动移动文件。
uni.downloadFile 的 tempFilePath 是临时路径,不可靠
调用 uni.downloadFile 后拿到的 tempFilePath 指向的是系统临时目录(如 Android 上类似 /data/user/0/io.dcloud.HBuilder/cache/xxx),这个路径:
- 对用户完全不可见
- 应用重启后可能失效
- 系统低内存时会被自动清理
- 无法通过 uni.saveFile 保留原始文件名(会生成随机名,如 1234567890.pdf)
所以它只适合做中转,不能作为最终保存目标。
Android 上用 plus.downloader 指定完整 file:// 路径
这是目前最稳定、用户可见、可命名的方案,但仅限 5+ App(即打包成原生 App 后运行,不适用于纯 H5 浏览器环境):
- 必须在 manifest.json 中勾选 “Android 模块” → “Downloader”
- 运行时需申请 android.permission.WRITE_EXTERNAL_STORAGE(Android 10 及以下)或 android.permission.READ_MEDIA_IMAGES 等(Android 11+)
- 路径必须以 file:// 开头,且指向可写目录,例如:
file://storage/emulated/0/MyApp/Reports/report_20260905.pdf
- 注意:Android 10+ 无法直接写入 SD 卡根目录,推荐用 plus.io.resolveLocalFileSystemURL('file:///storage/emulated/0/') 先探测可用路径
跨平台兼容写法:先下载再 copyFile
若需兼顾 iOS 和 Android 原生包,且接受文件存于应用沙盒内(用户不可直访,但持久稳定),可用以下流程:
- 调用 uni.downloadFile 获取 tempFilePath
- 调用 plus.io.copyFile 将其复制到 plus.io.documentsDirectory 下指定子路径
- 示例关键代码:
uni.downloadFile({
url: 'https://example.com/data.xlsx',
success: (res) => {
if (res.statusCode === 200) {
const targetPath = plus.io.documentsDirectory + 'exports/data.xlsx';
plus.io.copyFile({
oldPath: res.tempFilePath,
newPath: targetPath,
success: () => console.log('已保存至:', targetPath),
fail: (e) => console.error('复制失败:', e)
});
}
}
});
注意:plus.io.documentsDirectory 在 Android 上实际路径类似 file:///data/user/0/io.dcloud.HBuilder/files/doc/,iOS 上为应用 Documents 目录,均属沙盒,安全但不可被文件管理器直接列出。
纯 H5 环境下没有真正意义上的“本地存储目录”
浏览器受同源策略和沙盒限制,uni.downloadFile 在 H5 下实际触发的是浏览器原生下载行为,文件由浏览器决定保存位置(用户下载目录),你无法编程指定。此时:
- 无法控制路径、文件名(取决于浏览器设置)
- 无法读取或校验是否下载成功(success 回调仅表示 HTTP 请求完成)
- 所有 plus.xxx API 在 H5 下不可用,调用会报 plus is not defined
所以如果你的目标是“让用户点一下就存到桌面/下载文件夹”,那什么都不用改——uni.downloadFile 在 H5 下本就是这么工作的;但凡想干预路径或命名,就必须走原生包路线。


















