5

WinRT / C#で、オフラインで使用するためのオンラインカタログのキャッシュをサポートするために、画像をローカルフォルダーにダウンロードするにはどうすればよいですか?画像を直接ダウンロードし、コントロールをリンクして、フォールバックとしてキャッシュから画像を取得する方法はありますか?

    var downloadedimage = await HttpWebRequest.Create(url).GetResponseAsync();
    StorageFile imgfile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
                        "localfile.png", CreationCollisionOption.FailIfExists);

ダウンロードした画像をlocalfile.jpgとして保存するには、次に何をしますか?

4

5 に答える 5

10

Windows8用の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();
于 2012-06-03T10:35:32.753 に答える
3

これを試して:

        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()); 
于 2012-06-01T00:47:41.677 に答える
1

URLで表されるファイルをダウンロードする場合、最も簡単な方法は、BackgroundDownloaderクラスを使用することです。バックグラウンドダウンローダーの使用方法の詳細については、このページを参照してください。

于 2012-06-01T05:46:10.917 に答える
0

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);
于 2012-05-31T15:59:16.900 に答える
0

デフォルトでは、ビットマップイメージはWinRTによってキャッシュされ、開発者の介入は必要ありません。

于 2012-09-18T21:49:49.023 に答える