gpt4 book ai didi

c# - Web 服务器通过 HTTP 发送图片

转载 作者:可可西里 更新时间:2023-11-01 16:34:27 24 4
gpt4 key购买 nike

所以,我写了一个小网络服务器。首先,我尝试只发送文本,但现在我也尝试发送图片。 (或包含图片的 html 页面)

这是我尝试过的:

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 文件(其中包含图片),但它没有显示。然后,我试图在浏览器中只打开图片,但随后出现错误,提示无法显示图形,因为它包含错误。

最佳答案

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

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

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

但对于图像和其他数据,以下必须在您的响应中发生。

设置 Content Type header ,指定您要发送的内容的类型。例子是

Content-Type: image/gif

Content-Type: image/png

现在浏览器(或接收内容的任何东西)知道要期待什么。除了,您使用 ASCII 编码对图像进行编码。

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

这会导致 ASCII 将您的图像读取为文本,并删除或破坏它不理解的字母。 (这是您的大部分图像数据。)

您想要做的是,以您在 Content-Type header 中指定的格式发送响应的其余部分(图像,在 header 之后)。只需发送 ms.ToArray 调用的结果。

理想情况下,您将确保图像采用您指定的正确格式,并且不依赖于文件扩展名,但实际上,很多服务器在内容类型上撒谎并指定 image/* 并让浏览器自行判断。

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

希望这对您有所帮助。


附带说明一下,您的实现不擅长的是内存消耗。您正在使用内存流将整个图像加载到内存中,然后将其复制到数组中。每个请求在内存中有 2 个图像副本。我不确定您想要多少可扩展性。但是,如果您同时收到 10 个高分辨率图像请求(比如 5 MB,对于 8MP 相机拍摄的典型照片?),现在您的服务器突然将 100 MB 的数据加载到内存中。

如果您从用户那里接受文件并在写入文件之前将它们加载到内存中,这可能会成为一个更大的问题。如果用户决定上传 1 GB 的文件,它会导致您的服务器崩溃。 (我在一些用 ASP.NET 编写的网站上看到了这种情况,这是非常糟糕的。错误部分是 ASP.NET 的优化。)

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

关于c# - Web 服务器通过 HTTP 发送图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com