MAUI怎么实现文件下载功能 MAUI下载并保存文件方法

来源:这里教程网 时间:2026-02-21 17:40:22 作者:

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 已弃用)或使用
MediaStore
API
iOS:默认只能访问应用容器内路径;若要保存到“文件”App,需将文件复制到
FileSystem.Current.DocumentsDirectory
并确保
SupportsDocumentBrowser
在 Info.plist 中启用
Windows:无特殊权限要求,但保存到非应用目录需用户主动选择(即用 FilePicker)

基本上就这些。MAUI 文件下载不复杂但容易忽略平台差异和流管理,抓住“流式下载 + 沙盒路径 + 按需弹窗 + 进度可控”四个要点,就能稳稳落地。

相关推荐