2012-03-06 12 views
1

HTTPを介してクライアントのパスワードをHTTPサーバーに送信して検証するコードを記述しました。クエリ文字列(usrpwdを含む)を生成し、その要求をサーバーに送信します。それは動作します。httpサーバーがクライアントからファイルを受け取る方法

しかし、今ではそのサーバーにファイル(text/xml)を送信する必要があります。私はそれがどのようにできるかわかりません。

サーバー上またはクライアント内にのみコードを記述する必要がありますか。

ファイルを受け入れるためのサーバー上のメカニズムとファイルを送信するためのクライアント上のメカニズムは何ですか?

+0

私は、クライアントがユーザー&pwdを取得し、クエリ文字列を生成してサーバーに送信するコードを書いています。サーバーはサーバーにファイルを送信する必要があるときに応答を出します。クライアントから。 – user1196792

答えて

1

XMLファイルなら簡単です。

HTTPヘッダーにContent-Type: text/xmlを追加し、HTTPヘッダーの\r\n\r\nの後にXMLファイルデータを追加して、ソケット経由でWebサーバーに送信できます。

ウェブサーバーは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

もう1つは、ファイルを受信するサーバーサイドでコード化しなければならないことを問い合わせます... cilentは、サーバーからの応答を確認する必要があるファイルを送信します。 – user1196792

+0

はい、コピーを行うサーバー側のコードが必要です。たとえば、これを行うPHPファイルを作ることができます。必要なメインコードを以下に示します。 '$ target_path =" uploads/"; $ target_path = $ target_path。ベースネーム($ _FILES ['uploadedfile'] ['name']); move_uploaded_file($ _ FILES ['uploadedfile'] ['tmp_name']、$ target_path); – snibu

+0

コードには当惑しますが、ここではvs2010を使用した.netに基づいています。クライアント側。 – user1196792

1

これは、ファイルをロードする方法、サーバーのアプリケーションに依存します。 "GET"ではなくHTTP "POST"メソッドを使用してファイルを送信する必要があります。

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 

サーバアプリケーションは、そのような "マルチパート/フォームデータ" の境界でエンコードされたファイルは、何かを期待することがあります。HTTPプロトコルは、実際に、本当に簡単です

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

httpサーバーにファイルを送信するには、cURLまたはjsonまたは他のapiを使用する必要があります。 – user1196792

+0

URLを確認するhttp://www.daniweb.com/software-development/cpp/threads/281070それは解決策によって近いですが、それはPHPのためであり、私は視覚的なstdioで行う必要があります。ネット..どのように行うことができますか? – user1196792

2

  1. クライアントは、HTTPメソッド名、URL、およびプロトコルバージョンを含む行を送信します。
  2. クライアントは、要求パラメータを含むRFC822ヘッダーを送信し、データブロックは、そのデータブロックの詳細を示します。
  3. クライアントは、サーバが、プロトコルバージョン、ステータスコードとメッセージ
  4. を含む行を送信し、サーバが応答パラメータを含むRFC822ヘッダを送信すると、データブロックが続く場合(またはクライアントが実行されるデータブロック
  5. を送信しますHEAD要求)、データブロックの詳細
  6. メソッドがHEADでない限り、サーバーはデータブロックを送信します。
  7. 接続が切断されるか、プロトコルが再起動されます。

通常、サーバは、少なくともこれらのメソッドを理解する:

  • GET(クライアントはデータブロックを送信しない、サーバーがデータブロックを送信します)
  • GETと同じHEADを(が、サーバーは応答データを省略しますブロック)
  • POST(クライアントがデータブロックを送信し、サーバーがデータブロックで応答)
  • PUT(クライアントがデータブロックを送信し、サーバはデータブロックを送信しません)

GETリクエストはサーバーの状態を決して変更せず、その結果をキャッシュして再利用することができます(これはブラウザがページ間を行き来できるようにするためです)。POSTリクエストサーバの状態を変更します。これは、ファイルをアップロードするときに行うことです。

したがって、ファイルを送信するには、リクエストラインからなる応答文書(応答文書が必要かどうか、単純な確認ステータスコードで十分かどうかに応じて)、POSTまたはPUT要求を準備します。 ( "Host:"、 "User-Agent:"、...)、ファイルを記述するヘッダ( "Content-Type:"、 "Content-Length:"、...)、空の行、およびファイルの内容を確認し、それをTCP接続経由で送信し、ステータス行、応答ヘッダー、および応答ファイル(要求した場合)を読み戻します。

関連する問題