在C#中使用HTTP发送PNG

时间:2017-12-11 16:11:27

标签: c# http webserver png

我在C#中开发自己的简单网络服务器,并且我有正常的html文件和子文件夹等,并且工作正常......但我的问题在于发送PNG文件。

一旦浏览器发出HTTP请求并且其他代码完成了它的魔力,我需要发送一个响应头。这是我的代码:

        else if (URL.EndsWith(".ico") || URL.EndsWith(".png"))
        {
            if (File.Exists(Program.Start_Directory + URL))
            {
                byte[] ImgFile = File.ReadAllBytes(Program.Start_Directory + URL);
                sw.Write("HTTP/1.0 200 OK\r\n");
                sw.Write("Content-Type: image/png\r\n");
                sw.Write("Content-Length: " + ImgFile.Length + "\r\n");
                sw.Write("\r\n");
                sw.Write(ImgFile);
            }
            else
            {
                FileNotFoundPage(sw);
            }
        }

此实例中的sw是与浏览器的套接字连接的StreamWriter。

当我运行它时,浏览器屏幕变黑,就像它正在加载图像时一样,但没有图像加载,旋转的加载轮无限期地保持旋转状态。

我怎样才能让它发挥作用?感谢。

1 个答案:

答案 0 :(得分:0)

当您使用CREATE PROCEDURE test @table_name_one NVARCHAR(MAX), @table_name_two NVARCHAR(MAX), @threshhold FLOAT(53) AS BEGIN SET NOCOUNT ON; SELECT @table_name_one END GO EXEC test @table_name_one = 'a', @table_name_two = 'b', @threshhold = 1./3 (用于将具有特定StreamWriter的字符串写入流中)与二进制数据一起使用时,事情会变得混乱。

看起来你正在调用Encoding的{​​{3}}重载,并认为它将字节逐字写入输出流。文档说明这个重载实际上......

  

通过调用该对象上的ToString方法将对象的文本表示写入文本字符串或流

您有两种选择。继续使用StreamWriter.WriteStreamWriter,然后将二进制数据直接写入基础流:

Flush

或只是以字节为单位执行所有操作:

byte[] ImgFile = File.ReadAllBytes(Program.Start_Directory + URL);
sw.Write("HTTP/1.0 200 OK\r\n");
//...etc
sw.Flush();
sw.BaseStream.Write(ImgFile,0,ImgFile.Length);