我编写了用于将客户端用户密码发送到HTTP服务器以通过HTTP进行验证的代码。我生成查询字符串(包含usr
,pwd
)并将请求发送到服务器。这很有效。
但现在我必须将文件(text/xml
)发送到该服务器。我不知道怎么做。
我们是否必须在服务器上或仅在客户端中编写一些代码?
服务器上接受文件和客户端发送文件的机制是什么?
答案 0 :(得分:2)
HTTP协议非常简单,实际上是:
通常,服务器至少会理解这些方法:
在方法的选择中存在一些隐含的语义,因为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