首页 > 解决方案 > 如何将图像从 http 客户端保存到 UWP 中的特定文件夹

问题描述

我有一个小功能可以保存来自 http 客户端的图像,但我有 2 个问题。

  1. 图像被保存在 bin 文件夹中,我在创建的项目中有一个名为 photos 的文件夹,我希望将代码保存在其中。

  2. 我想再获得 8 张图像而不是覆盖当前图像,因为另一个调用将重写图像。我的代码如下,不同的id会给出不同的图像:

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(HttpMethod.Get, url+id))
    {
        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
        using (
            Stream contentStream = await (await httpClient.SendAsync(request)).Content.ReadAsStreamAsync(),
            stream = new FileStream("test", FileMode.Create, FileAccess.Write))
        {
            await contentStream.CopyToAsync(stream);
        }
    }
}

所以结果是一个名为 test 的文件,但覆盖了前一个文件。我想保存所有这些并保存在项目的文件夹中。我该怎么办?欢迎任何建议,谢谢。

标签: c#uwp

解决方案


1.

这样做new FileStream("test", ...)会打开一个新的文件流,.\test这不是我们想要的,就像.你的程序正在执行的目录一样。相反,任何和所有应用程序数据都应该进入Environment.SpecialFolder.ApplicationData\YourApplicationName

var photoLocation = Path.Combine(Environment.SpecialFolder.ApplicationData, "MyUwpApp", "Photos", "test");

// Ensure %AppData%\MyUwpApp\Photos exists, if not create it
if (!Directory.Exists(Path.GetDirectoryName(photoLocation))
    Directory.CreateDirectory(Path.GetDirectoryName(photoLocation));

stream = new FileStream(photoLocation, FileMode.Create, FileAccess.Write);

您可以检查目录是否存在于循环之外,只检查一次。但是,如果在循环期间被删除Photos或被删除,您的程序可能会崩溃。MyUwpApp如果你真的想要的话,你也可以保存返回值Path.GetDirectoryName(photoLocation),以避免调用它两次。

2.

您需要唯一的文件名。最简单的方法是将 附加id到每个文件中,就像 Roy Cohen 在他们的评论中所说:

var photoLocation = Path.Combine(Environment.SpecialFolder.ApplicationData, "MyUwpApp", "Photos", "test", id.ToString());

推荐阅读