Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading Image from Web Server in C# proxy

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.

like image 879
Xetius Avatar asked Dec 06 '22 05:12

Xetius


2 Answers

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);
        }
    }
}
like image 120
John Saunders Avatar answered Dec 09 '22 14:12

John Saunders


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

 if (resp.ContentType.StartsWith("image/"))
 {
   // Do your stuff
 }
like image 44
Dan Diplo Avatar answered Dec 09 '22 15:12

Dan Diplo