0

Winsock2 HTTP Post を介して PNG ファイルをアップロードしようとしています。これが私のリクエスト文字列です:

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

接続は問題ありません。エラーなどはありません。fileConちなみに からReadFile()です。そして、エラーコードはありません。読み取られたバイト数は、 の出力と同じですGetFileSize()。の内容を表示しようとしましたfileConが、これだけが得られました:

代替テキスト

「エラー」というタイトルは気にしないでください(私が設定しました)。

また、リクエストが完了するまでに時間がかかり、空白の応答が返されます。はい、HTTP ヘッダーのない空白です。私はリクエストを正しく行っていますか?POST データにファイルの内容を含める必要がありますか?

前もって感謝します。

編集: PNG サイズは約 256 KB です。私は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);
4

1 に答える 1

1

問題を解決するのに十分な情報がないため、代わりにメタ回答を提供します。パケットスニファ(wiresharkなど)を使用して、実際に送受信されているデータを正確に確認します。これにより、リクエストが正常であること、および取得する「空白の応答」が実際に空白であることを確認できます。

暗闇の中での1つのワイルドスタブ:コードスニペットに変数宣言が含まれていないため、「fileCon」のタイプがわかりませんが、PNGデータにnullバイトが含まれている可能性があることを忘れないでください。から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がデータの終わりであると解釈されるため、元のデータの残りの部分("world.")が使用されることはありません。

于 2010-12-29T13:30:19.730 に答える