Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download an image to local storage in Metro style apps

In WinRT / C#, How do I download an image to a local folder to support caching of an online catalogue for offline use? is there a way to directly download the images and link the control to get them from the cache as a fallback?

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

What do I do next to store downloadedimage as localfile.jpg?

like image 982
Jay Kannan Avatar asked May 31 '12 15:05

Jay Kannan


2 Answers

Try this:

        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()); 
like image 30
Sofian Hnaide Avatar answered Sep 28 '22 16:09

Sofian Hnaide


Looks like the code below from the HttpClient sample for Windows 8 solves the issue

    HttpRequestMessage request = new HttpRequestMessage(
        HttpMethod.Get, resourceAddress);
    HttpResponseMessage response = await rootPage.httpClient.SendAsync(request,
        HttpCompletionOption.ResponseHeadersRead);

httpClient is a HttpClient, and its BaseAddress needs to be set a the server folder of your resource. we can then do this to convert that to an image source (if that's what we're downloading)

    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);

or this to write it to file

    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();
like image 57
Jay Kannan Avatar answered Sep 28 '22 17:09

Jay Kannan