You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动