2010-12-29 12 views
0

Winsock2 HTTP Postを使用してPNGファイルをアップロードしようとしています。ここに私の要求文字列です:C++ Winsock APIを使用したPNGファイル(HTTP POST)のアップロード

boundary = "-----rueldotme";                 
request += "POST " + uri + " HTTP/1.1\r\n";          
request += "Host: " + hostname + "\r\n"; 
request += "User-Agent: " + UserAgent + "\r\n"; 
request += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"; 
request += "Accept-Language: en-us,en;q=0.5\r\n"; 
request += "Accept-Encoding: gzip,deflate\r\n"; 
request += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"; 
request += "Keep-Alive: 115\r\n"; 
request += "Connection: keep-alive\r\n"; 
request += "Content-Length: " + fileSize + "\r\n"; 
request += "Content-Type: multipart/form-data, boundary=" + boundary + "\r\n"; 
request += "\r\n"; 
request += "--" + boundary + "\r\n"; 
request += "Content-Disposition: form-data; name=\"filename\"; filename=\"" + fileName + "\"\r\n"; 
request += "Content-Type: image/png; charset=binary\r\n"; 
request += "Content-Transfer-Encoding: binary\r\n"; 
request += "\r\n"; 
request += "%s\r\n"; 
request += "\r\n"; 

接続がOKで、エラーなしとな、方法によってfileConReadFile()からです。エラーコードはありません。読み取られるバイト数は、GetFileSize()の出力と同じです。私はfileConの内容を表示しようとしただけで、私にこれを与えた:

alt text

タイトル「エラー」(私はそれを設定)を気にしないでください。

また、要求には時間がかかり、空白の応答が返されます。うん、HTTPヘッダーのない空白。私は要求を正しくしていますか?私は本当にファイルの内容をPOSTデータに含める必要がありますか?

ありがとうございます。

EDIT:PNGサイズは約256KBです。私は1mbpsの接続になっています。

EDIT:情報が不十分でしたら申し訳ありません。

int flz; 
char bdata[BSIZE]; 
DWORD dwe, bytesRead = 0; 
HANDLE fh = CreateFile(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
LPVOID fbuff = NULL; 
flz = GetFileSize(fh, NULL); 
fbuff = malloc(flz); 
ReadFile(fh, fbuff, flz, &bytesRead, NULL)); 

... 

sprintf_s(bdata, BSIZE, request.c_str(), reinterpret_cast<char *>(fbuff)); //BSIZE = 1024 

... 

send(sock, bdata, std::strlen(bdata), 0); 
+0

私は問題がPNG画像ファイルの内容を読んでそこにあると思うかもしれません。 – Mahantesh

+0

バイナリコンテンツをchar *に格納する必要があります。文字列には含まれません。 – Mahantesh

+0

AFAIKは関係ありません。私のバッファに加えて、LPVOIDと私はstd :: stringに変換しました。私はそこに問題を見ません。 – Ruel

答えて

1

ない問題を解決するための十分な情報なので、私が代わりにメタ答えをあげる::とにかく、ここで私は最近やったことだ データが正確かどうか確認するために、パケットスニファ(例えば、wireshark)を使用します実際に送受信されます。これにより、リクエストが正しいかどうか、本当に空白になっていることを確認することができます。

暗いところで1つの野生スタブ: コードスニペットに変数宣言が含まれていないため、「fileCon」の種類はわかりませんが、PNGデータがある可能性が高いことを忘れないでくださいヌルバイトが含まれているため、char*からstd::stringへのデフォルトの変換が混乱します。

編集: あなたの変更がstd::stringベースのバージョンはPNGデータはNULLバイトが含まれている可能性があること、つまり、持っていた同じバグが含まれています。おそらく、このコードは、より明確に説明します:

const char* data = "Hello\0world."; // some data that contains a null byte 
std::string dataStr(data); 
std::cout << dataStr << "\n"; // will print "Hello". 
std::cout << dataStr.size() << "\n"; // will print "5" 
char buf[512]; 
sprintf_s(buf, sizeof(buf), "Data: %s\n", data); 
std::cout << buf; // will print "Data: Hello" 

std::stringへの変換とsprintfでフォーマットの両方がデータの終わりであるとしてNULLバイトを解釈し、そのため、元のデータ("world.")の残りの部分は決して利用される。

+0

こんにちは、あなたの答えをありがとう、私は私の質問を編集しました。私はLiveHTTPHeadersを使ってこれらのヘッダ行を作成しました。そして、私は現在 'char *'変数を使ってリクエスト文字列を保持しています。 – Ruel

+0

こんにちは、更新していただきありがとうございます。私はファイルの内容を 'char *'バッファに渡し、 'send()'に 'request'という文字列を渡すことができますか? – Ruel

関連する問題