【发布时间】:2014-11-22 18:58:33
【问题描述】:
如何将图像保存到 Windows Phone 8.1 RT 中的“已保存图片”文件夹?我使用 HttpClient 从网上下载了图片。
【问题讨论】:
标签: c# image windows-runtime windows-phone-8.1 dotnet-httpclient
如何将图像保存到 Windows Phone 8.1 RT 中的“已保存图片”文件夹?我使用 HttpClient 从网上下载了图片。
【问题讨论】:
标签: c# image windows-runtime windows-phone-8.1 dotnet-httpclient
你只需要这个
var url = "Some URL";
var fileName = Path.GetFileName(url.LocalPath);
var thumbnail = RandomAccessStreamReference.CreateFromUri(url);
var remoteFile = await StorageFile.CreateStreamedFileFromUriAsync(fileName, url, thumbnail);
await remoteFile.CopyAsync(KnownFolders.SavedPictures, fileName, NameCollisionOption.GenerateUniqueName);
您需要在清单中设置图片库功能。
【讨论】:
感谢 MSDN 论坛上的 mSpot Inc,我解决了这个问题。我现在使用的代码:
StorageFolder picsFolder = KnownFolders.SavedPictures;
StorageFile file = await picsFolder.CreateFileAsync("myImage.jpg", CreationCollisionOption.GenerateUniqueName);
string url = "http://somewebsite.com/someimage.jpg";
HttpClient client = new HttpClient();
byte[] responseBytes = await client.GetByteArrayAsync(url);
var stream = await file.OpenAsync(FileAccessMode.ReadWrite);
using (var outputStream = stream.GetOutputStreamAt(0))
{
DataWriter writer = new DataWriter(outputStream);
writer.WriteBytes(responseBytes);
writer.StoreAsync();
outputStream.FlushAsync();
}
【讨论】:
如果您希望用户选择文件位置,您需要使用FileSavePicker 和pictureLibrary 作为SuggestedStartLocation。
如果你想在没有用户选择目的地的情况下保存它,你需要使用这样的东西:
Windows.Storage.KnownFolders.picturesLibrary.createFileAsync
我相信在这两种情况下,您都需要在清单中设置 Pictures Library capability。
【讨论】:
目前,我使用这个原生实现:
var url = new Uri(UriString, UriKind.Absolute);
var fileName = Path.GetFileName(url.LocalPath);
var w = WebRequest.CreateHttp(url);
var response = await Task.Factory.FromAsync<WebResponse>(w.BeginGetResponse, w.EndGetResponse, null);
await response.GetResponseStream().CopyToAsync(new FileStream(ApplicationData.Current.LocalFolder.Path + @"\" + fileName, FileMode.CreateNew));
var file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
await file.CopyAsync(KnownFolders.SavedPictures, fileName, NameCollisionOption.FailIfExists);
【讨论】: