将映像下载到Metro 风格应用中的本地存储
本文关键字:存储 应用 风格 映像 下载 Metro | 更新日期: 2023-09-27 18:35:59
在WinRT/C#中,如何将图像下载到本地文件夹以支持缓存在线目录以供离线使用? 有没有办法直接下载图像并链接控件以从缓存中获取它们作为回退?
var downloadedimage = await HttpWebRequest.Create(url).GetResponseAsync();
StorageFile imgfile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
"localfile.png", CreationCollisionOption.FailIfExists);
接下来我该怎么做才能将下载的图像存储为本地文件.jpg?
看起来下面来自 Windows 8 的 HttpClient 示例的代码解决了这个问题
HttpRequestMessage request = new HttpRequestMessage(
HttpMethod.Get, resourceAddress);
HttpResponseMessage response = await rootPage.httpClient.SendAsync(request,
HttpCompletionOption.ResponseHeadersRead);
httpClient 是一个 HttpClient,它的 BaseAddress 需要设置为资源的服务器文件夹。 然后我们可以这样做以将其转换为图像源(如果这是我们正在下载的内容)
InMemoryRandomAccessStream randomAccessStream =
new InMemoryRandomAccessStream();
DataWriter writer = new DataWriter(randomAccessStream.GetOutputStreamAt(0));
writer.WriteBytes(await response.Content.ReadAsByteArrayAsync());
await writer.StoreAsync();
BitmapImage image = new BitmapImage();
imagecontrol.SetSource(randomAccessStream);
或者这个把它写到文件
var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
filename, CreationCollisionOption.ReplaceExisting);
var fs = await imageFile.OpenAsync(FileAccessMode.ReadWrite);
DataWriter writer = new DataWriter(fs.GetOutputStreamAt(0));
writer.WriteBytes(await response.Content.ReadAsByteArrayAsync());
await writer.StoreAsync();
writer.DetachStream();
await fs.FlushAsync();
试试这个:
var response = await HttpWebRequest.Create(url).GetResponseAsync();
List<Byte> allBytes = new List<byte>();
using (Stream imageStream = response.GetResponseStream())
{
byte[] buffer = new byte[4000];
int bytesRead = 0;
while ((bytesRead = await imageStream.ReadAsync(buffer, 0, 4000)) > 0)
{
allBytes.AddRange(buffer.Take(bytesRead));
}
}
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
"localfile.png", CreationCollisionOption.FailIfExists);
await FileIO.WriteBytesAsync(file, allBytes.ToArray());
如果要下载由URL表示的文件,最简单的方法是使用BackgroundDownloader类。 有关如何使用后台下载器的更多信息,请参阅此页面。
GetResponseAsync 会给你一个 WebResponse 文件,而不是图像:
Stream imageStream = downloadedimage.GetResponseStream();
然后,您可以写入映像文件:
byte[] imageData = new byte[imageStream.Length];
using(StreamReader reader = new Streamreader(imageStream))
{
reader.ReadBytes(imageData, 0, imageData.Length);
}
await FileIO.WriteBytesAsync(imgfile, imageData);
默认情况下,位图图像由 WinRT 缓存,开发人员无需干预。