2012-03-06 365 views
1

我已经编写了将客户端用户密码发送到HTTP服务器以便通过HTTP进行验证的代码。我生成查询字符串(包含usr,pwd)并将请求发送到服务器。这样可行。http服务器如何从客户端接收文件

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

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

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

+0

我编写的代码,其中客户端采取用户PWD和生成查询字符串,并发送至服务器,服务器给response.but当我必须将文件发送到服务器我们为它采取的文件服务器做来自客户。 – user1196792 2012-03-06 11:49:17

回答

1

如果它的XML文件很容易。

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

网络服务器将从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"; 

`

+0

THKS一个多查询一下我们在服务器端的代码,它接收文件... cilent送我们必须检查从服务器。所以在这方面做服务器的响应文件。 – user1196792 2012-03-06 13:19:55

+0

是的,你需要有服务器端代码进行复制。例如,你可以做一个PHP文件这样做。所需的主要代码如下所示。 '$ target_path =“uploads /”; $ target_path = $ target_path。 basename($ _FILES ['uploadedfile'] ['name']); move_uploaded_file($ _ FILES ['uploadedfile'] ['tmp_name'],$ target_path);' – snibu 2012-03-06 13:28:50

+0

thks为代码,但这里的服务器基于.net使用vs2010 .how服务器通过http请求接收客户端文件客户端。 – user1196792 2012-03-07 05:46:45

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 

服务器应用程序可能希望以 “多/表单数据” 边界编码的文件,这样的事情:

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 
+0

有必要使用cURL或JSON或其他API来发送文件到http服务器。 – user1196792 2012-03-06 13:38:51

+0

检查网址http://www.daniweb.com/software-development/cpp/threads/281070它靠近解决方案,但它是为PHP和我必须在视觉stdio.net做..如何可以做? – user1196792 2012-03-07 07:24:13

2

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

  1. 客户端发送一个包含HTTP方法名称,URL和协议版本的行
  2. 客户端发送包含请求参数的RFC822头,如果数据块如下,有关数据块的详细信息。
  3. 客户端发送所述数据块
  4. 服务器发送包含协议版本,状态码和消息的行
  5. 服务器发送包含响应参数,并且如果一个数据块如下的RFC822报头(或客户端执行的HEAD请求),有关数据块的详细信息
  6. 服务器发送数据块,除非该方法是HEAD。
  7. 连接断开或协议重新启动。

典型地,服务器将明白至少这些方法:

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

有一个在方法的选择一些隐含的语义,在GET请求从未修改服务器的状态,其结果可以被缓存和再利用(这是什么可以让浏览器来回页之间),而POST请求请改变服务器状态 - 顺便说一句,这是你上传文件时要做的事情。

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

相关问题