http服务器如何从客户端接收文件

时间:2012-03-06 11:34:00

标签: c visual-studio-2008 http

我编写了用于将客户端用户密码发送到HTTP服务器以通过HTTP进行验证的代码。我生成查询字符串(包含usrpwd)并将请求发送到服务器。这很有效。

但现在我必须将文件(text/xml)发送到该服务器。我不知道怎么做。

我们是否必须在服务器上或仅在客户端中编写一些代码?

服务器上接受文件和客户端发送文件的机制是什么?

3 个答案:

答案 0 :(得分:2)

HTTP协议非常简单,实际上是:

  1. 客户端发送包含HTTP方法名称,URL和协议版本
  2. 的行
  3. 客户端发送包含请求参数的RFC822标头,如果是数据块,则发送有关数据块的详细信息。
  4. 客户端发送数据块
  5. 服务器发送包含协议版本,状态代码和消息的行
  6. 服务器发送包含响应参数的RFC822标头,如果跟随数据块(或客户端执行HEAD请求),则发送有关数据块的详细信息
  7. 服务器发送数据块,除非方法是HEAD。
  8. 连接已拆除,或协议重新启动。
  9. 通常,服务器至少会理解这些方法:

    • GET(客户端不发送数据块,服务器发送数据块)
    • HEAD(与GET相同,但服务器省略响应数据块)
    • POST(客户端发送数据块,服务器响应数据块)
    • PUT(客户端发送数据块,服务器不发送数据块)

    在方法的选择中存在一些隐含的语义,因为GET请求永远不会修改服务器状态,并且它们的结果可能被缓存和重用(这是允许浏览器在页面之间来回传递的),而POST请求则是更改服务器状态 - 顺便说一句,这是您上传文件时的操作。

    因此,为了发送文件,准备一个POST或PUT请求(取决于您是否期望一个回复文档,或者一个简单的确认状态代码是否足够),该请求由请求行组成,包含额外的标题协议信息(“主机:”,“用户代理:”,...),描述文件的标题(“内容类型:”,“内容长度:”,...),空行和文件内容,并通过TCP连接发送,然后读回状态行,响应头和响应文件(如果你要求的话)。

答案 1 :(得分:1)

如果它是一个XML文件很容易。

您可以在HTTP标头中添加Content-Type: text/xml,并在HTTP标头的\r\n\r\n之后附加XML文件数据,并通过套接字将其发送到网络服务器。

网络服务器将从HTTP标头中了解它包含XML文件并获取该文件。对于bnary文件,您需要将其转换为base64

例如,我使用缓冲区来存储http请求。现在,如果将此缓冲区发送到连接到Web服务器的套接字,则FileName.xml将保存在Web服务器中。为此,upload.php必须能够使用POST数据。 边界是显示数据之间的边界,是HTTP协议所需要的。它可以是任何随机生成的数字,并确保起始边界和近边界数相等。内容长度也是文件的长度。     `

char buf[2048] =  "POST http://www.nameofyoursite.com/upload.php HTTP/1.1\r\n"
                                                "Host: www.nameofyoursite.com\r\n"
                                                "Content-Type: multipart-form-data, boundary=1234567\r\n"
                                                "Content-Length: 15\r\n\r\n"
                    "--1234567\r\n"
                    "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"FileName.xml\"\r\n"
                    "Content-Type: text/xml\r\n"
                    "<xml>This is a test</xml>\r\n"
                    "--1234567--\r\n";

`

答案 2 :(得分:1)

这取决于服务器的应用程序如何加载文件。 您可能需要使用HTTP“POST”方法而不是“GET”发送文件。

POST /your_uri HTTP/1.1
Host: www.yourhost.com
Content-type: application/x-www-form-urlencoded
Content-length: 41

filename=test.xml&data=yoururlencodeddata

服务器应用程序可能需要使用“multipart / form-data”边界编码的文件,如下所示:

Content-type: multipart/form-data, boundary=AaBb01x

--AaBb01x
content-disposition: form-data; name="yourfield"

Your field data
--AaBb01x
content-disposition: form-data; name="yourfilefield"; filename="filename.xml"
Content-Type: text/xml

<root>your xml data</root>
--AaBb01x