原始 http 服务器:发送图像问题
Raw http server: send image issue
我正在使用一种物联网设备。最后我有一个简单的 httpd 服务器可以工作,简单的 html 页面工作起来很有魅力,但浏览器无法识别图像。我认为这是 http header 问题,但我不知道哪里出了问题。
例如,我的测试页面是这样的:
<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 图片,但没有成功。我确定图片发送正确。
该请求要求 png
GET /img.png HTTP/1.1\r\n
为什么不 return 正确的内容类型;
Content-Type: image/png\r\n
我做了完全一样的 - 用于 IoT 的原始 http 服务器,您的响应看起来完全正确。尝试检查以下内容:
您在关闭套接字之前正确地冲洗了套接字。如果你在 send() 之后立即调用 close()
,你可能会遇到这个问题——数据没有被正确写入
Content-Length 应该正好是您文件的大小。确保您没有计算 \r\n 字节的 http 响应。浏览器可能仍在等待尾字节
最后,获取浏览器网络日志:)
我 运行 遇到了一个非常相似的问题。
在我的例子中,当我认为我使用的是 \r\n
行终止符时,我实际上只使用了 \n
;它在 chromium 中为 text/html
页面提供服务时运行良好,但在为 image/jpeg
提供服务时抛出 net::ERR_INVALID_HTTP_RESPONSE
错误。因此页面已加载,但图像已损坏。
我的解决方法是确保一切都按预期使用 \r\n
。
我正在使用一种物联网设备。最后我有一个简单的 httpd 服务器可以工作,简单的 html 页面工作起来很有魅力,但浏览器无法识别图像。我认为这是 http header 问题,但我不知道哪里出了问题。
例如,我的测试页面是这样的:
<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 图片,但没有成功。我确定图片发送正确。
该请求要求 png
GET /img.png HTTP/1.1\r\n
为什么不 return 正确的内容类型;
Content-Type: image/png\r\n
我做了完全一样的 - 用于 IoT 的原始 http 服务器,您的响应看起来完全正确。尝试检查以下内容:
您在关闭套接字之前正确地冲洗了套接字。如果你在 send() 之后立即调用
close()
,你可能会遇到这个问题——数据没有被正确写入Content-Length 应该正好是您文件的大小。确保您没有计算 \r\n 字节的 http 响应。浏览器可能仍在等待尾字节
最后,获取浏览器网络日志:)
我 运行 遇到了一个非常相似的问题。
在我的例子中,当我认为我使用的是 \r\n
行终止符时,我实际上只使用了 \n
;它在 chromium 中为 text/html
页面提供服务时运行良好,但在为 image/jpeg
提供服务时抛出 net::ERR_INVALID_HTTP_RESPONSE
错误。因此页面已加载,但图像已损坏。
我的解决方法是确保一切都按预期使用 \r\n
。