微信小程序文件下载实现方式(UniApp)
前言
在 uni-app 中处理文件下载,核心优势在于跨平台兼容。
uni-app 封装了 uni.downloadFile,同时针对不同平台(H5、App、小程序)提供了差异化的保存 API。
以下是 uni-app 中文件下载的完整方案:
核心流程对比
| 平台 | 下载API | 保存/打开方式 |
|---|---|---|
| 微信小程序 | uni.downloadFile |
uni.saveImageToPhotosAlbum / uni.openDocument / uni.shareFileMessage |
| App (Android/iOS) | uni.downloadFile 或 plus.downloader |
uni.saveImageToPhotosAlbum / plus.io 写入本地 / uni.openDocument |
| H5 | uni.downloadFile (受限) |
创建 <a> 标签触发浏览器下载 |
关键区别:
App 端大文件强烈建议使用
plus.downloader(支持后台下载、断点续存、系统通知栏进度),uni.downloadFile在 App 端仅适合小文件。
通用下载
下载是先下载到临时目录,再保存到不同的位置。
1 | /** |
按文件类型保存
1 | function saveFileByType(tempFilePath, fileName) { |
APP端
大文件下载
plus.downloader
当文件 > 50MB 或需要后台下载时,必须用此方案:
1 | // #ifdef APP-PLUS |
自定义目录
1 | // #ifdef APP-PLUS |
注意事项
| 注意点 | 说明 |
|---|---|
| 条件编译 | uni-app 的核心能力,务必用 #ifdef / #ifndef 区分平台逻辑,避免 H5 调用 plus 报错 |
| 域名白名单 | 小程序端仍需在后台配置 downloadFile合法域名;App/H5 无此限制 |
| 权限声明 | App 端保存相册需在 manifest.json → App模块配置 → Permissions 中勾选 WRITE_EXTERNAL_STORAGE;iOS 还需在 Info.plist 添加 NSPhotoLibraryAddUsageDescription |
| H5 跨域 | H5 下载第三方资源受 CORS 限制,若服务端未配 Access-Control-Allow-Origin,需通过后端代理转发 |
| 临时文件清理 | uni.downloadFile 产生的临时文件在 App 重启后可能被清除;如需持久化,App 用 plus.io.copyFile,小程序用 uni.getFileSystemManager().saveFile() |
| 文件名中文乱码 | URL 中的中文文件名建议先 encodeURIComponent 编码;openDocument 和 shareFileMessage 的 fileName 参数传原始中文名即可 |
| base64 转文件 | 如果接口返回的是 base64 而非 URL,先用 uni.base64ToArrayBuffer + FileSystemManager.writeFile 转为临时文件,再走上述保存流程 |
选型建议
1 | 文件大小 < 20MB → uni.downloadFile(全平台统一) |
总结:
uni-app 文件下载的关键是条件编译 + 平台差异化保存策略。小文件用
uni.downloadFile一套代码搞定;App 端大文件务必切换到plus.downloader;H5 端回归浏览器原生下载机制。始终记得处理相册授权失败和域名白名单这两个高频踩坑点。