原始 http 服务器:发送图像问题
Posted
技术标签:
【中文标题】原始 http 服务器:发送图像问题【英文标题】:Raw http server: send image issue 【发布时间】:2019-04-29 07:27:44 【问题描述】:我正在使用一种物联网设备。最后,我有一个简单的 httpd 服务器可以工作,简单的 html 页面就像一个魅力,但浏览器无法识别图像。我认为这是 http 标头问题,但我不知道是什么问题。
例如,我的测试页面如下所示:
<html>
<head><title>test page</title></head>
<body>
hello world!
<img src="img.png">
</body>
</html>
如果我去http://de.vi.ce.ip/ 会生成 2 个请求:
GET / HTTP/1.1\r\n
Accept text/html, application/xhtml+xml, */*\r\n
Accept-Language: en-EN\r\n
...
GET /img.png HTTP/1.1\r\n
Accept image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5\r\n
Accept-Language: en-EN\r\n
...
为了让我的服务器响应:
HTTP/1.0 200 OK\r\n
Content-Type: text/html\r\n
Content-Length: 131\r\n
\r\n
<page data>
HTTP/1.0 200 OK\r\n
Content-Type: image/png\r\n
Content-Length: 5627\r\n
\r\n
<image binary data>
结果我可以看到文字,但图像已损坏。
我尝试了更多参数,例如Connection: close, Accept-Ranges: bytes, Content-Location (path)
。
我在Content-Type: image/jpeg
下尝试了 jpeg 图像,但没有成功。我确定图片发送正确。
【问题讨论】:
您必须发送正确的Content-Type
。即图像/JPEG
@Holger 我做到了。我的问题是错字,对不起。就我而言,它是 image/png。
我认为您从文件中读取了 png。您是否以二进制模式打开文件?
@Holger 是的。在将其发送到 tcp 之前,我已经检查了输出缓冲区,它是正确的。二进制内容看起来应该如此。
【参考方案1】:
我做了完全相同的 - 物联网的原始 http 服务器,您的响应看起来绝对正确。尝试检查以下内容:
在关闭套接字之前,您正确地刷新了套接字。如果你在 send() 之后立即调用close()
,你很可能会遇到这个问题——数据没有被正确写入
Content-Length 应该与文件的大小完全相同。确保您没有计算 http 响应的 \r\n 字节。浏览器可能仍在等待尾字节
最后,获取浏览器网络日志:)
【讨论】:
原来是内存问题。 tcp_write 函数返回 -1 女巫是内存错误。我使用 lwip,它基于它自己的奇怪的分配函数。我刚刚增加了缓冲区大小并且它起作用了。没有flush函数,但是有tcp_output函数,witch强制发送数据,但是没用。我也尝试过分块写入数据,但结果是一样的。【参考方案2】:请求请求png
GET /img.png HTTP/1.1\r\n
为什么不返回正确的内容类型;
Content-Type: image/png\r\n
【讨论】:
抱歉,有问题是拼写错误。我正在发送正确的内容类型 image/png 为 png 或 image/jpeg 为 jpg。【参考方案3】:我遇到了一个非常相似的问题。
就我而言,当我认为我使用的是\r\n
行终止符时,我实际上只使用了\n
;它在 chromium 中为text/html
页面提供服务,但在提供image/jpeg
时抛出net::ERR_INVALID_HTTP_RESPONSE
错误。所以页面加载了,但是图片坏了。
我的解决办法是确保一切都按照应有的方式使用 \r\n
。
【讨论】:
以上是关于原始 http 服务器:发送图像问题的主要内容,如果未能解决你的问题,请参考以下文章