【问题标题】:Uploading files through a HTTP POST in C++在 C++ 中通过 HTTP POST 上传文件
【发布时间】:2010-11-01 07:24:26
【问题描述】:

我正在尝试将文件和其他 POST 变量发送到我服务器上的 PHP 脚本。 Google 上没有好的资源,我发现的代码示例也不起作用。最好不要使用 cURL。

【问题讨论】:

  • 你在为什么平台编码?

标签: c++ http file post upload


【解决方案1】:

我会说自己动手。它不是太复杂。

Wireshark 中捕获从浏览器发送的HTTP 帖子,并根据需要使用spec 作为指导进行逆向工程。 (请参阅下面 Andreas Magnusson 的回答,了解更多相关规格。)

我个人会推荐这种方法来学习协议,而不仅仅是纯粹的规范。仅从规范中学习东西非常困难。我宁愿探索已知 http 客户端的不同行为,并尝试以规范为指导来弄清楚事情是如何工作的。

在您熟悉 HTTP 后,相应地通过套接字格式化和发送数据。

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

【讨论】:

  • Wireshark??说真的,如果您自己的目标是滚动,那么阅读规范和编码应该始终是您的初始解决方案。然后,当您完成并且该死的事情仍然无法正常工作时,您不知道为什么,是时候将您的输出与 Wireshark 浏览器的输出进行比较了。调整 Wireshark 捕获是 Cargo-Cult 编程的 HTTP 等价物。
  • 好的,将“调整”更改为“逆向工程以了解协议”。仅从规格中学习非常困难,您需要一些东西来玩。
  • 首先,您需要正确的规范(请参阅我的回答),然后您的初始尝试应始终按照规范,如果这不起作用,请使用 Wireshark 从有效的应用程序总是有帮助的。
【解决方案2】:

只需几个资源就可以很容易地自己动手

这里是an example of a GET request via ASIO(Boost 中的 C++ 网络库)

这里是the HTTP protocol made really easy

GET 请求是您查看网站上任何页面的方式。使用该代码,您可以下载任何页面并将其作为原始文本获取。如您所见,它向服务器发送了一个 GET 标头。正如that HTTP protocol page 中所述,POST request 看起来像这样

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. 你把你的网址放在帖子后面
  3. 将内容类型更改为您尝试上传的文件类型。
  4. 将 Content-Length 设置为该文件中的字节数
  5. 在回车后附加文件(替换“home=Cosby&favorite+flavor=flies”)

【讨论】:

    【解决方案3】:

    另一个(更快捷)的解决方案是使用实用程序,通过 system() 或类似的调用。 例如 wget 实用程序有一个 --post-file 选项。

    【讨论】:

      【解决方案4】:

      如果您要自己推出,则需要相关的RFC for HTTP file uploading(谷歌搜索“rfc http 文件上传”会产生相同的结果)。该 RFC 还展示了如何处理混合文件和其他 FORM 数据(或 POST 变量)。问题当然是您可能还想阅读MIME RFC...

      【讨论】:

        【解决方案5】:

        这对我在 debian 上非常有用(http get、http post):

        http://cpp-netlib.github.com

        我使用需要 boost 1.49 的 v 0.9.3

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 1970-01-01
          • 2011-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多