【问题标题】:How to save image file in a C Web Server after it was sent on POST Request如何在 POST 请求中发送图像文件后将其保存在 C Web 服务器中
【发布时间】:2019-12-25 23:15:08
【问题描述】:

我正在尝试使用套接字构建 Web 服务器。我有 GET 请求的解析器​​,现在我希望能够从表单向服务器发送图像。

打印请求标头后,这是我得到的:

POST / HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------15680533759245126501880539822
Content-Length: 14006
Origin: http://127.0.0.1:8080
Connection: keep-alive
Referer: http://127.0.0.1:8080/form.html
Upgrade-Insecure-Requests: 1

-----------------------------15680533759245126501880539822
Content-Disposition: form-data; name="textline"

4213124124123123153534123412
-----------------------------15680533759245126501880539822
Content-Disposition: form-data; name="datafile"; filename="5.jpg"
Content-Type: image/jpeg

����

这是我的表格:

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <form action="/"
        enctype="multipart/form-data" method="post">
        <p>
            Type some text (if you like):<br>
            <input type="text" name="textline">
        </p>
        <p>
            Please specify a file, or a set of files:<br>
            <input type="file" name="datafile">
        </p>
            <div>
            <input type="submit" value="Send">
            </div>
        </form>
    </body>
</html>

我的问题是:为什么我只接收到 4 个字节的图像,我应该怎么做才能将接收到的数据保存在 jpg 文件中?

【问题讨论】:

  • 您使用的是 Windows 吗?
  • 看起来您正在打印为字符串,请使用任何支持 HEX 模式的编辑器检查文件或将文件转储为十六进制,以检查第五个字节是否为零(即'\0')。跨度>
  • 你说得对,我完全忘记了图像文件中有'\0'。现在我只需要弄清楚我应该如何将它保存为图像。

标签: c sockets http


【解决方案1】:

打印请求标头后,这是我得到的:

您打印的不是请求标头,而是标头和正文的一部分。

为什么我只收到来自图像的 4 个字节

您没有提供任何代码,因此无法确定。但一个典型的问题是假设单个recv 足以检索所有数据。不是这种情况。相反,您需要首先读取标题(它可以作为第一个 recv 的一部分包含,但也可以分布在多个 recv 上),提取正文的长度(在这种情况下为 Content-Length: 14006 但它也可能成为chunked transfer encoding) 然后阅读正文。然后你需要一个multipart/form-data 的body 来把body 当作multipart MIME message 来处理并提取各个部分。

这一切都不是微不足道的,HTTP 和 MIME 都比你看几个例子看起来更复杂。如果您真的想自己实现所有内容,请阅读(长)标准-它们的存在是有原因的。我建议您改用现有的库来处理这个问题。

【讨论】:

  • 感谢您的回答。确实我不知道在纯 C 中完成这会有多复杂。可以通过脚本(即 PHP)处理这部分(文件的保存)吗?
  • @MikeBear:PHP 已内置支持此功能 - 参见例如 Parsing multipart form data
猜你喜欢
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多