2010-11-15 16 views
2

J'ai besoin de télécharger des images à partir d'une URL distante et de les sérialiser dans Isolated Storage, mais je n'arrive pas à comprendre comment cela fonctionne, je suis actuellement en train de sérialiser les URI aux images - et je peux le faire fonctionner, mais vous voulez télécharger l'image et le stocker dans le système de fichiers, quelle est la meilleure façon de le faire en utilisant C# et Silverlight. J'ai essayé de trouver des moyens de le faire, mais ils sont trop compliqués, si possible, je peux stocker des données d'image dans le XML si c'est une solution, mais je veux juste télécharger le fichier - .NET sur le Le bureau a beaucoup de méthodes pour faire ce genre de chose, mais j'ai besoin d'une solution Silverlight. S'il y a des exemples qui démontrent ce genre de chose, alors cela peut aider aussi - cela semble être un problème simple mais je ne peux pas le résoudre et j'ai essayé beaucoup de choses pour que cela fonctionne simplement, de sorte que je puisse sauver un Image d'une URL distante vers IsolatedStorage et faites-le de manière asynchrone.Comment sérialiser des images d'une URL distante vers IsolateStorage ou XML?

J'ai un peu de code pour le moment, mais je n'arrive pas à le rationaliser, je le posterai si aucune alternative appropriée n'est affichée si nécessaire.

Répondre

2

Essayez cette classe. J'espère que ça va t'aider.
Pour commencer attrapant utilisation:

ImageGrabber grabber = new ImageGrabber(); 
    grabber.GrabImage(@"http://www.google.com.ua/images/srpr/nav_logo25.png"); 

BTW dans cet exemple, je l'ai utilisé très nice method qui permettent de lire des octets de flux (même si ce flux ne supporte pas les opération de recherche).

public class ImageGrabber 
{ 
    public void GrabImage(string url) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.Method = "POST"; 
     request.BeginGetRequestStream(RequestCallback, request); 
    } 

    private void RequestCallback(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;   
     request.BeginGetResponse(GetResponseCallback, request); 
    } 

    private void GetResponseCallback(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 

     // End the operation 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
     Stream streamResponse = response.GetResponseStream(); 

     byte[] bytes = ReadToEnd(streamResponse); 
     //save image to isolated storage as file.png 
     IsolatedStorageFile.GetUserStoreForApplication().CreateFile("file.png").Write(bytes, 0, bytes.Count()); 
    } 

    private static byte[] ReadToEnd(Stream stream) 
    { 
     long originalPosition = stream.Position; 
     stream.Position = 0; 

     try 
     { 
      byte[] readBuffer = new byte[4096]; 

      int totalBytesRead = 0; 
      int bytesRead; 

      while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) 
      { 
       totalBytesRead += bytesRead; 

       if (totalBytesRead == readBuffer.Length) 
       { 
        int nextByte = stream.ReadByte(); 
        if (nextByte != -1) 
        { 
         byte[] temp = new byte[readBuffer.Length * 2]; 
         Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); 
         Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); 
         readBuffer = temp; 
         totalBytesRead++; 
        } 
       } 
      } 

      byte[] buffer = readBuffer; 
      if (readBuffer.Length != totalBytesRead) 
      { 
       buffer = new byte[totalBytesRead]; 
       Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); 
      } 
      return buffer; 
     } 
     finally 
     { 
      stream.Position = originalPosition; 
     } 
    } 
} 

fichier sera enregistré dans le stockage isolé:

{System drive}:\Users\{User Name}\AppData\LocalLow\Microsoft\Silverlight\is\{bunch of autogenerated folders}\file.png 
+0

semble intéressant, je tentais de faire quelque chose comme ça, mais ne pouvait pas comprendre cela - ressemble à ceci pourrait être utile, va essayer cela et voir comment cela fonctionne avec mon application – RoguePlanetoid

+0

Alors, ça fonctionne correctement? –

+0

C'est une bonne solution pour remplacer ma méthode existante car elle n'était pas aussi simple que je l'aurais souhaité - c'est une meilleure solution. – RoguePlanetoid

2

Je l'ai utilisé les éléments suivants:

WebClient client = new WebClient(); 
byte[] bytes = client.DownloadData("http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png");