Pregunta Descargue una imagen al almacenamiento local en aplicaciones de estilo Metro


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 uso sin conexión? ¿Hay alguna forma de descargar directamente las imágenes y vincular el control para obtenerlas de la memoria caché como un recurso alternativo?

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

¿Qué hago después para almacenar la imagen descargada como localfile.jpg?


5
2018-05-31 15:14


origen


Respuestas:


Parece que el siguiente código de la muestra de HttpClient para Windows 8 resuelve 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 debe configurarse en la carpeta del servidor de su recurso. luego podemos hacer esto para convertirlo en 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 escribirlo en un archivo

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

10
2018-06-03 10:35



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

3
2018-06-01 00:47



Si desea descargar un archivo representado por una URL, la forma más sencilla es usar la clase BackgroundDownloader. Ver esta página para obtener más información sobre cómo utilizar el programa de descarga de fondo.


1
2018-06-01 05:46



GetResponseAsync le dará un archivo WebResponse no la imagen:

Stream imageStream = downloadedimage.GetResponseStream();

Luego 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
2018-05-31 15:59



Por defecto, las imágenes de mapa de bits son almacenadas en caché por WinRT sin la intervención del desarrollador.


0
2017-09-18 21:49