如何在UWP应用中使用Windows.Web.Http下载文件并保存到设备
在UWP中使用Windows.Web.Http下载并保存文件
嘿,这个问题我熟!在UWP里用Windows.Web.Http处理文件下载其实没那么复杂,我帮你把代码补全,再讲清楚关键步骤:
首先,你的核心需求是拿到Web服务返回的文件流,然后保存到设备上。这里分几个关键环节:发送请求获取响应、处理文件流、选择保存位置并写入文件。
完整代码示例
下面是补全后的DownloadFile方法,包含了完整的下载和保存逻辑:
using Windows.Storage; using Windows.Storage.Pickers; using Windows.UI.Popups; using Windows.Web.Http; public async Task DownloadFile(string webServiceUrl) { // 用using包裹HttpClient,确保资源自动释放 using (var httpClient = new HttpClient()) { try { // 发送GET请求到你的Web服务 HttpResponseMessage response = await httpClient.GetAsync(new Uri(webServiceUrl)); // 验证请求是否成功,失败会直接抛出异常 response.EnsureSuccessStatusCode(); // 用FileSavePicker让用户选择保存的位置和文件名(UWP推荐的方式,无需额外权限) var savePicker = new FileSavePicker(); // 根据你的文件类型调整这里的扩展名,比如如果是Excel就加".xlsx" savePicker.FileTypeChoices.Add("通用文件", new List<string>() { "*" }); savePicker.SuggestedFileName = "下载的文件"; StorageFile targetFile = await savePicker.PickSaveFileAsync(); if (targetFile != null) { // 获取Web服务返回的输入流 using (var inputStream = await response.Content.ReadAsInputStreamAsync()) { // 打开本地文件的写入流 using (var outputStream = await targetFile.OpenAsync(FileAccessMode.ReadWrite)) { // 高效复制流并自动关闭,比手动处理更省心 await RandomAccessStream.CopyAndCloseAsync(inputStream, outputStream); } } // 给用户一个成功提示 await new MessageDialog("文件已经成功保存啦!").ShowAsync(); } } catch (Exception ex) { // 捕获并提示错误,比如网络问题、权限不足等 await new MessageDialog($"下载出错啦:{ex.Message}").ShowAsync(); } } }
关键细节说明
- 资源释放:用
using语句包裹HttpClient和各种流,确保操作完成后自动释放资源,避免内存泄漏。 - 请求验证:
response.EnsureSuccessStatusCode()会在请求返回错误状态码(比如404、500)时直接抛出异常,方便你集中处理错误情况。 - 文件权限:用
FileSavePicker让用户选择保存位置,不需要在Package.appxmanifest中额外声明文件访问权限(因为是用户主动选择的路径)。如果想直接保存到应用的私有存储(比如本地文件夹),可以替换成这段代码:// 保存到应用本地文件夹,覆盖已存在的同名文件 StorageFile targetFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("下载的文件.pdf", CreationCollisionOption.ReplaceExisting); - 身份验证:如果你的Web服务需要Token或者账号密码,记得在发送请求前给
HttpClient添加请求头,比如Bearer Token:httpClient.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue("Bearer", "你的身份令牌");
内容的提问来源于stack exchange,提问作者slayernoah




