uni.downloadFile仅存临时路径,需调用uni.saveFile等持久化;Android/iOS平台差异大,须区分处理文件路径、权限及存储位置;大文件应避免直接使用该API。

uni-app 里 uni.downloadFile 下载后文件不保存到相册或本地目录
调用 uni.downloadFile 后只拿到临时路径(tempFilePath),不主动移动或保存,用户根本找不到文件。这是因为 uni-app 的下载 API 默认只缓存到临时目录,iOS 和 Android 都不会自动写入相册或文档目录。
- 必须手动调用
uni.saveFile或uni.saveImageToPhotosAlbum(仅图片)才能持久化 - Android 下保存 PDF、Excel 等非媒体文件,需额外调用
uni.getFileSystemManager().moveFile移动到Documents或Downloads目录才方便用户访问 - iOS 对非图片/视频文件限制更严,
uni.saveImageToPhotosAlbum会直接失败,必须走uni.saveFile+ 后续通过uni.openDocument打开,不能指望它出现在“文件”App 里 - 临时文件有生命周期,页面跳转或 App 切后台后可能被清理,不保存就等于白下
下载 PDF/Excel 后调用 uni.openDocument 报错 “fail file not found”
错误通常不是文件真丢了,而是路径没对上 —— uni.openDocument 要求传入的是**绝对路径**,且必须是本地沙盒内可读路径;而 uni.downloadFile 返回的 tempFilePath 是临时路径,uni.saveFile 返回的 savedFilePath 才是稳定路径。
- 别直接把
res.tempFilePath传给uni.openDocument - 务必等
uni.saveFile成功回调后再取res.savedFilePath,这个路径才是安全的 - H5 端不支持
uni.openDocument,要提前判断:uni.getSystemInfoSync().platform !== 'h5' - Android 上如果文件后缀名缺失(比如服务器返回无后缀的 blob),
uni.openDocument会打不开,需手动补全,例如:savedPath + '.pdf'
安卓端下载文件到系统 Downloads 目录需要额外权限和路径处理
Android 10+(API 29+)默认启用分区存储(Scoped Storage),直接往 /sdcard/Download/ 写文件会被拒绝,uni-app 的 uni.downloadFile 和 uni.saveFile 都无法绕过,必须用原生能力或降级处理。
- 最低兼容方案:用
uni.getFileSystemManager().moveFile把保存后的文件移到uni.env.USER_DATA_PATH下,再通过uni.showActionSheet提示用户“前往文件管理器查找” - 如需真正进系统 Downloads 目录,必须在 manifest 中声明
android:requestLegacyExternalStorage="true"(仅适配 Android 10),并使用plus.android.requestPermission动态申请WRITE_EXTERNAL_STORAGE - uni-app 官方插件市场有封装好的「Android 文件下载」插件,内部调用了
MediaStoreAPI,比自己手写原生更稳妥
下载大文件时卡死、进度条不动、内存爆掉
uni.downloadFile 是一次性加载整个响应体进内存,遇到几十 MB 的文件,尤其低端 Android 机,极易触发 OOM 或主线程阻塞,表现为 UI 假死、进度回调不触发。
- 服务端必须支持
Range请求头,否则无法分块下载;前端无法靠 JS 控制流式接收 - uni-app 当前版本(截至 3.9.x)不支持流式下载,不要试图用
onProgressUpdate做大文件友好体验——它只在下载完成时才触发一次 - 真实场景中,大于 5MB 的文件建议改用 WebView 内嵌下载链接,或跳转 H5 页面用
a[download]标签,交由系统处理 - 若坚持用
uni.downloadFile,至少加个 loading 提示 + 超时控制:timeout: 60000,避免用户干等

















