我想将文件从客户端位置上传到服务器。目前,我有一个客户端 - 服务器套接字程序,我可以通过它发送/接收文件,但我想即兴发挥它。
我的想法是使用HTTP PUT / POST从客户端(客户端的大多数编码)传输文件到服务器。由于我不知道HTTP编程,所以我需要一些如何实现它的指导。我想在这样做时使用带有BSD套接字的C ++,而不是其他库。我的目标是向服务器发送一个表单,如下面给出的HTTP POST / PUT请求,并获取上传到服务器的文件“main.cpp”。
PUT http://localhost/ HTTP/1.0
Host: localhost
Content-type: form-data
Content-length: 90
FileUpload: /Users/SG/files/main.cpp
我能够编写一个从客户端执行某些PUT的虚拟程序,运行Apache的Web服务器返回一个HTTP 200.我目前无法理解的是以下两件事,我猜这些东西有些联系:
如何在上面的表单中指定从客户端上传的文件?
如果我理解正确,将在客户端站点读取该文件,然后将文件内容发送到服务器,其中服务器端脚本将从客户端读取字节并在以下位置创建文件的副本服务器。这是对的吗?
感谢任何帮助。
谢谢,
萨扬
答案 0 :(得分:4)
如上所述,这是不可能的。单独的C ++没有套接字API。 (编辑:添加了BSD套接字API,现在可以了。)
您的实现可能会提供特定于操作系统的套接字API,在这种情况下,您的问题归结为“如何编写HTTP客户端?”。答案是(a)不要,或(b)非常仔细地阅读the HTTP specification,并按照它告诉你的方式。基本步骤是:
gethostbyname
获取IP地址。connect
打开TCP套接字。send
撰写请求(您已经知道它的外观)。read
阅读回复。困难的部分是强有力地解析响应,因为有许多功能需要担心。如果您的客户端绑定到特定服务器,那么它的响应将是非常可预测的,您可以忽略相当多的HTTP规范(至少在您更改服务器的配置,更新其软件等之前)。 p>
如果您在完成之前已经准备好放弃,那么可以使用非常好的HTTP库,例如libcURL。
答案 1 :(得分:2)
我想用C ++来做这件事, 没有任何图书馆的帮助或 system()调用。
套接字编程总是需要系统调用。 C ++是一种非常通用的语言。 ISO语言定义没有指定任何有关套接字或网络编程的内容,因此为了做到这一点,您需要依赖于另一个特定于系统的库/标准,例如UNIX / Linux上的BSD套接字API。通常,在C ++中,您将使用更高级别的第三方库来封装这些较低级别的系统调用,例如Boost.ASIO。但是,即使这需要一些学习,更不用说在套接字上正确实现HTTP标准了。
答案 2 :(得分:0)
我能够达到我想要的。我的http post请求字符串如下所示:
"POST %s HTTP/1.0\r\n"
"Host: %s\r\n"
"Content-type: multipart/form-data\r\n"
"Content-length: %d\r\n\r\n"
"Content-Disposition: %s; filename: %s\n"
我将上述字符串从客户端的cpp程序发送到服务器,运行Apache,它通过cgi脚本处理数据,也用cpp编写。数据与Content Disposition
属性一起放置。任何人都可以向我指出如何将上述内容转换为HTTP PUT?