2012-05-31 11 views
5

In WinRT/C#, Come si scarica un'immagine in una cartella locale per supportare la memorizzazione nella cache di un catalogo online per l'utilizzo offline? c'è un modo per scaricare direttamente le immagini e collegare il controllo per ottenerle dalla cache come ripiego?Download di un'immagine nell'archivio locale in app in stile Metro

Cosa devo fare per memorizzare l'immagine scaricata come localfile.jpg?

risposta

10

Sembra che il codice di seguito dal campione HttpClient per Windows 8 risolve il problema

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

HttpClient è un HttpClient, e la sua BaseAddress deve essere impostato in una cartella del server della risorsa. allora possiamo fare questo per convertire che ad una sorgente di immagini (se questo è quello che stiamo scaricando)

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

o questo per scrivere su 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(); 
0

GetResponseAsync vi darà un non file di WebResponse l'immagine:

Stream imageStream = downloadedimage.GetResponseStream(); 

Quindi è possibile scrivere sul file di immagine:

byte[] imageData = new byte[imageStream.Length]; 
using(StreamReader reader = new Streamreader(imageStream)) 
{ 
    reader.ReadBytes(imageData, 0, imageData.Length); 
} 
await FileIO.WriteBytesAsync(imgfile, imageData); 
+0

Abbiamo bisogno di modificare ReadBytes su reader.BaseStream.Read, ma non posso confermare se funziona ancora - aggiornerà –

+0

provato var downloadingimage = attendi HttpWebRequest.Create (url) .GetResponseAsync(); con GetResponseStreamAsync(), non ha funzionato - cosa dobbiamo cambiare? –

+0

Cosa non ha funzionato? Quale eccezione è stata lanciata? – Slugart

3

Prova questo:

 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()); 
+0

Grazie questa è una soluzione semplice e funziona. Sto lavorando a una soluzione utilizzando Metro App per Windows 8.1 – Juan

1

Se vuoi scaricare un file rappresentato da un URL, il modo più semplice è usare la classe BackgroundDownloader. Vedere la pagina this per ulteriori informazioni su come utilizzare il downloader in background.

+0

Ho bisogno di implementare una meccanica di memorizzazione nella cache per eseguire la mia app in modalità offline, niente di troppo complesso. questo potrebbe complicare inutilmente –

+0

Questo sembra essere un modo più semplice per usarlo. Grazie. –

0

da immagini bitmap predefinite sono memorizzate nella cache da WinRT senza alcun intervento richiesto dallo sviluppatore.

Problemi correlati