user1196792
user1196792

Reputation: 66

how http server received file from client

I have written code for sending client user passwords to an HTTP server for verification via HTTP. I generate the query string (containing usr, pwd) and send the request to the server. That works.

But now I have to send a file (text/xml) to that server. I don't know how it can be done.

Do we have to write some code on the server or only in the client?

What are the mechanisms on the server for accepting file and on the client for sending files?

Upvotes: 1

Views: 2671

Answers (3)

Simon Richter
Simon Richter

Reputation: 29618

The HTTP protocol is really simple, actually:

  1. the client sends a line containing HTTP method name, URL and protocol version
  2. the client sends an RFC822 header containing request parameters and, if a data block follows, details about the data block.
  3. the client sends the data block
  4. the server sends a line containing protocol version, status code and message
  5. the server sends an RFC822 header containing response parameters and, if a data block follows (or the client performed a HEAD request), details about the data block
  6. the server sends the data block, unless the method is HEAD.
  7. the connection is either torn down, or the protocol restarted.

Typically, servers will understand at least these methods:

  • GET (client does not send data block, server sends data block)
  • HEAD (same as GET, but server omits response data block)
  • POST (client sends data block, server responds with data block)
  • PUT (client sends data block, server does not send data block)

There is some implied semantics in the choice of method, in that GET requests never modify server state and their results may be cached and reused (which is what allows the browser to go back and forth between pages), while POST requests do change server state -- incidentally, this is what you do when you upload a file.

So, in order to send a file, prepare a POST or PUT request (depending on whether you expect a reply document, or if a simple acknowledgement status code is sufficient), which consists of the request line, the headers containing extra protocol info ("Host:", "User-Agent:", ...), the headers describing the file ("Content-Type:", "Content-Length:", ...), an empty line, and the file contents, and send that over a TCP connection, then read back the status line, the response headers and the response file (if you asked for one).

Upvotes: 2

snibu
snibu

Reputation: 581

If its a XML file it is easy.

You can add Content-Type: text/xml in the HTTP header and append the XML file data after the \r\n\r\n of the HTTP header and send it via the socket to the webserver.

The webserver will understand from the HTTP header that it contains XML file and takes the file. In the case of a bnary file, you will need to convert it to base64.

For example I have used a buffer to store the http request. Now if you send this buffer to the socket connected to the webserver, the FileName.xml will be saved in the webserver. For this to work the upload.php has to able to work with POST data. The boundary is to show the boundary between the data and is needed by the HTTP protocol. It can be any random generated number and make sure the start boundary and the close boundary numbers are equal. Also content length is the length of the file. `

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";

`

Upvotes: 1

dAm2K
dAm2K

Reputation: 10349

It depends on the server's application how to load the file. You may need to send the file using the HTTP "POST" method instead of "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

The server application may expect files encoded with "multipart/form-data" boundaries, something like that:

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

Upvotes: 1

Related Questions