MAUI文件下载核心是HttpClient流式获取+平台沙盒路径保存,需注意权限、进度监听与平台差异:Android/iOS限沙盒,Windows/macOS可用FilePicker选路径。

MAUI 实现文件下载功能,核心是使用 HttpClient 获取远程文件流,再通过平台特定的文件系统 API(如 FileSystem.Current.CacheDirectory 或 FileSystem.Current.AppDataDirectory)保存到本地。跨平台统一处理需注意权限、路径、后台执行和用户提示等细节。
用 HttpClient 下载文件流并写入本地
这是最常用且跨平台的方式,适用于大多数场景(如下载图片、PDF、ZIP 等)。关键步骤:发起请求 → 读取响应流 → 写入文件流 → 关闭资源。
- 推荐使用
HttpClient的GetStreamAsync避免内存溢出(尤其大文件),不要用GetByteArrayAsync - 目标路径建议用
FileSystem.Current.CacheDirectory(临时缓存)或AppDataDirectory(持久存储) - 务必用
using确保流正确释放,避免文件句柄占用
示例代码:
var httpClient = new HttpClient(); var url = "https://example.com/file.pdf"; var fileName = "downloaded_file.pdf"; // 获取缓存目录路径 var cachePath = Path.Combine(FileSystem.Current.CacheDirectory, fileName); var stream = await httpClient.GetStreamAsync(url); // 写入文件 using var fileStream = File.Create(cachePath); await stream.CopyToAsync(fileStream);
下载后调用平台原生保存对话框(如“另存为”)
若需让用户自选保存位置(尤其在 Windows/macOS/iOS 上),需调用平台特定 API。Android 和 iOS 限制较严,一般只能存入应用沙盒;而 Windows/macOS 可借助 Microsoft.Maui.Storage.FilePicker 让用户选择路径。
- Android/iOS:默认只能保存到
CacheDirectory或AppDataDirectory,无法直接写入相册或文档目录(需额外申请权限 + 使用 MediaStore / PHPhotoLibrary) - Windows/macOS:可用
FilePicker.Default.PickSaveFileAsync()弹出保存对话框,返回用户选中的StorageFile,再把下载流写入其中 - 注意:
PickSaveFileAsync返回的是IStorageFile,需用其OpenStreamForWriteAsync()获取写入流
添加进度监听与 UI 反馈
MAUI 本身不提供内置下载进度回调,但可通过 HttpCompletionOption.ResponseHeadersRead + 分块读取实现手动进度计算。
- 先发 HEAD 请求获取
Content-Length,预知总大小 - 再用
GetAsync(..., HttpCompletionOption.ResponseHeadersRead)获取响应,手动循环ReadAsync并累加已读字节数 - 结合
INotifyPropertyChanged或ObservableObject更新绑定的Progress属性,驱动 ProgressBar 或 Text 显示
小技巧:对小文件可省略进度;对大文件(>5MB)建议加上,避免用户误以为卡死。
权限与平台注意事项
不同平台对文件写入有不同约束,漏掉可能运行时报错或静默失败:
-
Android:targetSdk 33+ 需声明
android:requestLegacyExternalStorage="true"(仅限旧适配)或改用沙盒路径(推荐);下载到公共目录(如 Downloads)需WRITE_MEDIA_STORAGE(API 33 已弃用)或使用MediaStoreAPI -
iOS:默认只能访问应用容器内路径;若要保存到“文件”App,需将文件复制到
FileSystem.Current.DocumentsDirectory并确保SupportsDocumentBrowser在 Info.plist 中启用 - Windows:无特殊权限要求,但保存到非应用目录需用户主动选择(即用 FilePicker)
基本上就这些。MAUI 文件下载不复杂但容易忽略平台差异和流管理,抓住“流式下载 + 沙盒路径 + 按需弹窗 + 进度可控”四个要点,就能稳稳落地。










