2012-05-31 670 views
5

En WinRT/C#, ¿cómo descargo una imagen en una carpeta local para admitir el almacenamiento en caché de un catálogo en línea para su uso sin conexión? ¿Hay alguna manera de descargar directamente las imágenes y vincular el control para obtenerlas del caché como una alternativa?Descargar una imagen en el almacenamiento local en las aplicaciones de estilo Metro

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

¿Qué debo hacer al lado de storeloadedimage as localfile.jpg?

Respuesta

10

Parece que el código de abajo de la muestra HttpClient para Windows 8 soluciona el problema

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

HttpClient es un HttpClient, y su BaseAddress se debe establecer una carpeta del servidor de su recurso. entonces podemos hacer esto para convertir eso a una fuente de imagen (si eso es lo que estamos descargando)

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 esto para escribir en el 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 le dará no un archivo WebResponse la imagen:

Stream imageStream = downloadedimage.GetResponseStream(); 

Entonces se puede escribir en el archivo de imagen:

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

Tenemos que cambiar ReadBytes por reader.BaseStream.Read, pero no puedo confirmar si aún funciona: actualizará –

+0

intentado var publishedloaded = aguarde HttpWebRequest.Create (url) .GetResponseAsync(); con GetResponseStreamAsync(), no funcionó, ¿qué tenemos que cambiar? –

+0

¿Qué no funcionó? ¿Qué excepción fue lanzada? – Slugart

3

Prueba esto:

 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

Gracias, esta es una solución fácil y funciona. Estoy trabajando en una solución usando la aplicación Metro para Windows 8.1 – Juan

1

Si desea descargar un archivo representado por una URL, la forma más fácil es utilizar la clase BackgroundDownloader. Consulte la página this para obtener más información sobre cómo usar el programa de descarga en segundo plano.

+0

Necesito implementar una mecánica de almacenamiento en caché para ejecutar mi aplicación en modo sin conexión, nada demasiado complejo. esto podría complicar innecesariamente –

+0

Esta parece ser una manera más fácil de usarlo. Gracias. –

0

Por defecto de mapa de bits imágenes se almacenan en caché por WinRT sin intervención requerida por el desarrollador.

Cuestiones relacionadas