通过HTTP POST在C++中上传文件

4

我正在尝试将文件和其他POST变量发送到我的服务器上的PHP脚本。在谷歌上找不到好的资源,而我找到的代码示例也无法工作。最好不要使用cURL。


你在为哪个平台编码? - Frank Schwieterman
5个回答

4
如果您要自己编写代码,您需要查看相关的HTTP文件上传RFC(在Google上搜索“rfc http文件上传”也可以找到相同的结果)。这个RFC还展示了如何处理文件和其他表单数据(或POST变量)的混合。问题在于,您可能还需要阅读MIME RFC

2

只需要几个资源就可以很容易地自己编写代码。

这里有一个使用ASIO(Boost中的C++网络库)进行GET请求的示例:async_client.cpp

这里是使HTTP协议变得非常简单的HTTP协议页面

GET请求是您可以查看站点上任何页面的方式。使用该代码,您可以下载任何页面并将其作为原始文本获取。如您所见,它向服务器发送了一个GET标头。正如在HTTP协议页面中解释的那样,POST请求如下所示:

POST /path/script.cgi HTTP/1.0 From:
frog@jmarshall.com User-Agent:
HTTPTool/1.0 Content-Type:
application/x-www-form-urlencoded
Content-Length: 32

home=Cosby&favorite+flavor=flies
  1. 发送文件:
  2. 在post后面输入您的URL
  3. 将内容类型更改为您要上传的文件类型。
  4. 将Content-Length设置为该文件中的字节数
  5. 在回车后添加文件(替换“home=Cosby&favorite+flavor=flies”)

1

我会建议你自己动手实践。这并不太复杂。

使用Wireshark捕获从浏览器发送的HTTP POST请求,并根据需要进行反向工程,使用规范作为指南。(也可以参考下面Andreas Magnusson的答案以获取更相关的规范)。

个人而言,我建议采用这种方法来学习协议,而不仅仅是遵循规范。仅仅通过规范来学习东西是相当困难的。我宁愿通过已知的HTTP客户端的不同行为来探索并尝试使用规范作为指南来弄清楚事情是如何工作的。

一旦你熟悉了HTTP,就可以相应地格式化和发送数据到套接字。

此外,如果你不熟悉套接字编程,请查看Beej's guide to socket programming


5
Wireshark?认真的吗?如果你的目标是编写自己的代码,那么阅读规范并从中编码应该始终是你的初始解决方案。然后当你完成之后,该死的东西仍然不起作用,而且你不知道为什么时,才是使用Wireshark将你的输出与浏览器输出进行比较的时候。微调Wireshark捕获的HTTP等效于货船崇拜式编程。 - Andreas Magnusson
好的,将“tweak”更改为“反向工程以了解协议”。仅从规范上学习相当困难,您需要一些可以操作的东西。 - Doug T.
1
首先,您需要正确的规格(请参阅我的答案),然后您的初始尝试应始终根据规格进行,如果这样做不起作用,则使用来自正常工作的应用程序的Wireshark捕获进行diff:ing总是有帮助的。 - Andreas Magnusson

1
另一种(更快速而不讲究)的解决方案是使用一个实用工具,通过system()或类似的调用来完成。 例如,wget实用工具有一个--post-file选项。

1

这对我在Debian上的工作非常好(HTTP GET,HTTP POST):

http://cpp-netlib.github.com

我使用的是 v0.9.3 版本,需要 boost 1.49。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接