Web服务器通过HTTP发送图片

时间:2012-11-03 10:07:18

标签: c# http webserver image

所以,我写了一个小的Webserver。首先,我试图只发送文本,但现在我也试图发送图片。 (或包含图片的html-Page)

这是我尝试过的:

if ((Path.GetExtension(filename).ToLower() == "jpg") || (Path.GetExtension(filename).ToLower() == "png") || (Path.GetExtension(filename).ToLower() == "gif"))
{
    Image image = Image.FromFile(filename);
    MemoryStream ms = new MemoryStream();
    image.Save(ms, image.RawFormat);
    responseContent = Encoding.Default.GetString(ms.ToArray());
    responseheader = "HTTP/1.1 200 OK\r\n" +
                     "Server: MiniWebServer\r\n" +
                     "Content-Length: " + responseContent.Length + "\r\n" +
                     "Content-Language: de\r\n" +
                     "Connection: close\r\n\r\n"; 
}

finalResponse = responseheader + responseContent;
return Encoding.ASCII.GetBytes(finalResponse);

所以,我试图在浏览器中打开html文件(包含图片),但它没有显示出来。然后,我尝试仅在浏览器中打开图片,但随后出现一个错误,表示无法显示图形,因为它包含错误。

1 个答案:

答案 0 :(得分:2)

您将所有内容编码为字符串。

对于HTTP标头,这很好,因为所有浏览器都希望标头可以这种方式读取,并且必须像现在一样使用ASCII进行编码。

如果您要发送文本,也可以,因为大多数浏览器在您未指定内容类型时默认为ASCII模式。

但是对于图片和其他数据,必须在您的回复中发生以下情况。

设置内容类型标头,指定您要发送的内容的类型。 例子是

  

内容类型:image / gif

  

内容类型:image / png

现在,浏览器(或接收内容的任何内容)知道会发生什么。除此之外,您使用ASCII编码对图像进行编码。

ASCII仅用于将简单测试编码为字节。 (我说的很简单,因为ASCII只支持非常少的字符集。它不支持多种语言等。像Unicode,UTF和其他一些编码那样。)

这会导致ASCII以文本形式读取您的图像,并剥离或损坏它不理解的字母。 (这是您的大部分图像数据。)

您要做的是,以Content-Type标题中指定的格式发送响应的其余部分(图像,标题之后)。只需从ms.ToArray电话发送结果。

理想情况下,您将确保图像采用您指定的正确格式,并且不依赖于文件扩展名,但实际上,许多服务器都在讨论内容类型并指定image/*并让浏览器搞清楚了。

Here's a good example on how to build a web server in C#.

希望这有帮助。


另一方面,你的实现不好的是内存消耗。您正在使用内存流将整个映像加载到内存,然后将其复制到阵列。这是每个请求在内存中的2个副本。我不确定你想要多少可扩展性。但是,如果您同时获得10个高分辨率图像请求(例如5 MB,对于800万像素摄像机拍摄的典型照片?),现在您的服务器突然将100 MB数据加载到内存中。

如果您在接收来自用户的文件并在写入文件之前将其加载到内存中,这可能会成为一个更大的问题。如果用户决定上传1 GB的文件,它将关闭您的服务器。 (我在一些使用ASP.NET编写的网站中看到了这种情况,这非常糟糕。故障部分是ASP.NET的优化。)

您可以做的是打开文件流,并将字节复制到响应中而不加载整个图像。以上链接显示了此代码。