2009-08-13 9 views
3

イメージを1つのサーバーから読み取り、それをHttpContextに返すプロキシを作成しようとしていますが、文字ストリームを戻しています。C#プロキシでWebサーバーからイメージを読み取る

私は次のことをしようとしています:

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

をしかし、私は先に述べたように、これは単なるテキストで応答しています。

どのようにイメージであると伝えますか?

編集:これは、imgタグのソース属性のWebページからアクセスしています。コンテンツタイプをapplication/octet-streamに設定すると、ファイルを保存するように要求され、それをimage/jpegに設定するだけでファイル名で応答します。私が望むのは、呼び出しページによって返され表示される画像です。

答えて

13

あなたがバイナリで作業しているので、あなたはテキストリーダーである、StreamReaderを使用したくありません!私は現在、アプリケーションでこれを使用

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

ありがとうございます。私を完全に壁に追い込んでいた。 – Xetius

+0

これは本当に私を助けてくれてありがとう。このアプローチは、テキストやバイナリ形式のあらゆるタイプの応答でOKでしょうか? – tomfumb

+0

それまでは、はい。もちろん、応答の種類によっては、ヘッダーなどを設定する必要があるかもしれません。 –

1

レスポンスにコンテンツタイプを設定する必要があります。ここでそれをやるのコードの抜粋です:

// 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

ファイルの保存を求めるプロンプトが表示されます。私はイメージを表示するために、imgタグでこれを使用しています。 – Xetius

1

私はあなたにWebResponseリクエストによって返さContentTypeをチェックする必要があるだろうと思います。

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

さて、あなたは正しくコンテンツタイプを設定したと仮定して、あなただけの応答ストリームを使用する必要があります。コンテンツURLは、クエリ文字列値(画像へのURL)として渡されます。

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(); 
} 
関連する問題