views:

794

answers:

4

I am trying to write a proxy which reads an image from one server and returns it to the HttpContext supplied, but I am just getting character stream back.

I am trying the following:

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

But as I mentioned earlier, this is just responding with text.

How do I tell it that it is an image?

Edit: I am accessing this from within a web page in the source attribute of an img tag. Setting the content type to application/octet-stream prompts to save the file and setting it to image/jpeg just responds with the filename. What I want is the image to be returned and displayed by the calling page.

+1  A: 

You're going to need to set the Content Type on your response. Here's a snippet of code that'll do it:

// 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";
JustLoren
This prompts to save the file. I am using this in an img tag so want it to display the image.
Xetius
A: 

I guess you would need to check the ContentType returned by your WebResponse request.

 if (resp.ContentType.StartsWith("image/"))
 {
   // Do your stuff
 }
Dan Diplo
+3  A: 

Since you are working with binary, you don't want to use StreamReader, which is a TextReader!

Now, assuming that you've set the content-type correctly, you should just use the response stream:

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);
        }
    }
}
John Saunders
Can't thank you enough. Was driving me up the wall completely.
Xetius
A: 

I use this in an application currently. Content URL is passed in as a query string value (the URL to the 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();
}
Jeremy