2009-08-13 10 views
3

J'essaye d'écrire un proxy qui lit une image d'un serveur et la renvoie au HttpContext fourni, mais je récupère juste le flux de caractères.Lecture d'image à partir du serveur Web en proxy C#

Je suis en train de ce qui suit:

WebRequest req = WebRequest.Create(image); 
WebResponse resp = req.GetResponse(); 
Stream stream = resp.GetResponseStream(); 
StreamReader sr = new StreamReader(stream); 
StreamWriter sw = new StreamWriter (context.Response.OutputStream); 

sw.Write (sr.ReadToEnd()); 

Mais comme je l'ai mentionné plus tôt, cela est tout simplement réagissais avec le texte.

Comment puis-je lui dire que c'est une image?

Editer: J'y accède depuis une page web dans l'attribut source d'une balise img. Définir le type de contenu sur les invites application/octet-stream pour enregistrer le fichier et le définir sur image/jpeg répond simplement avec le nom de fichier. Ce que je veux, c'est que l'image soit retournée et affichée par la page d'appel.

Répondre

13

Puisque vous travaillez avec binaire, vous ne voulez pas utiliser StreamReader, qui est un texte lecteur!

Maintenant, en supposant que vous avez défini correctement le type de contenu, vous devez simplement utiliser le flux de réponse:

const int BUFFER_SIZE = 1024 * 1024; 

var req = WebRequest.Create(imageUrl); 
using (var resp = req.GetResponse()) 
{ 
    using (var stream = resp.GetResponseStream()) 
    { 
     var bytes = new byte[BUFFER_SIZE]; 
     while (true) 
     { 
      var n = stream.Read(bytes, 0, BUFFER_SIZE); 
      if (n == 0) 
      { 
       break; 
      } 
      context.Response.OutputStream.Write(bytes, 0, n); 
     } 
    } 
} 
+0

Je ne vous remercierai jamais assez. Me conduisait complètement au mur. – Xetius

+0

Merci, cela m'a vraiment aidé aussi. Cette approche devrait-elle être acceptable pour tout type de réponse - toute forme de texte ou binaire? – tomfumb

+0

En ce qui concerne, oui. Bien sûr, pour certains types de réponse, vous devrez peut-être définir des en-têtes, etc. –

1

Vous devrez définir le type de contenu sur votre réponse. Voici un extrait de code qui va le faire:

// specify that the response is a JPEG 
// Also could use "image/GIF" or "image/PNG" depending on what you're 
// getting from the server 
Response.ContentType = "image/JPEG"; 
+0

Cela vous invite à enregistrer le fichier. J'utilise ceci dans un tag img donc je veux qu'il affiche l'image. – Xetius

1

Je suppose que vous devez vérifier la ContentType retournée par votre demande de WebResponse.

if (resp.ContentType.StartsWith("image/")) 
{ 
    // Do your stuff 
} 
0

J'utilise ceci dans une demande actuellement. L'URL du contenu est transmise en tant que valeur de chaîne de requête (l'URL de l'image).

try 
{ 
    if (ContentUrl != "") 
    { 
     string imgExtension = ContentUrl.Substring(ContentUrl.Length - 3, 3); 
     switch (imgExtension) 
     { 
      case "": 
       //image/bmp 
       Response.ContentType = "image/bmp"; 
       break; 

      case "jpg": 
       //image/jpeg 
       Response.ContentType = "image/jpeg"; 
       break; 

      case "gif": 
       //image/gif 
       Response.ContentType = "image/gif"; 
       break; 

      default: 
       Response.ContentType = "image/jpeg"; 
       break; 
     } 

     if (!ContentUrl.StartsWith("http")) 
      Response.BinaryWrite(new byte[] { 0 }); 

     WebClient wc = new WebClient(); 
     wc.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     Byte[] result; 
     result = wc.DownloadData(ContentUrl); 


     Response.BinaryWrite(result); 

    } 
} 
catch (Exception ex) 
{ 
    Utility.WriteEventError(Utility.EVENTLOG_SOURCE, string.Format("ImageProxy Error... Url: {0}, Exception: {1}", ContentUrl, ex.ToString())); 
} 
finally 
{ 
    Response.End(); 
} 
Questions connexes