Загрузка файла PNG (HTTP POST) с C ++ Winsock API - PullRequest
0 голосов
/ 29 декабря 2010

Я пытаюсь загрузить файл PNG через Winsock2 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";

С подключением все в порядке, ошибок нет и так далее, кстати, fileCon от ReadFile().И нет кода ошибки.Количество прочитанных байтов совпадает с выводом GetFileSize().Я пытался отобразить содержимое fileCon, но только дал мне это:

alt text

Не обращайте внимания на заголовок " Ошибка " (я установил его).

Кроме того, на запрос уходит много времени, и я получаю пустой ответ.Да, пусто без заголовков HTTP.Я правильно делаю запрос?Должен ли я действительно включать содержимое файла в данные POST?

Заранее спасибо.

EDIT : размер PNG составляет около 256 КБ.У меня соединение 1 Мбит / с.

РЕДАКТИРОВАТЬ : Извините, если информация была недостаточной.Во всяком случае, вот что я сделал в последнее время:

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

1 Ответ

1 голос
/ 29 декабря 2010

Недостаточно информации для решения проблемы, поэтому вместо этого я дам мета-ответ: используйте анализатор пакетов (например, wireshark ), чтобы точно определить, какие данные на самом деле отправляются и принимаются.Это позволит вам убедиться, что запрос в порядке, и что «пустой ответ», который вы получаете, действительно пустой.

Один дикий удар в темноте: вы не включили ни одного объявления переменнойв вашем фрагменте кода, так что я не знаю, что тип "fileCon", но не забывайте, что данные PNG, скорее всего, содержат нулевые байты, что испортит преобразование по умолчанию из char* в std::string.

Редактировать: Ваша модификация содержит ту же ошибку, что и версия на основе std::string, а именно то, что данные PNG могут содержать нулевые байты.Возможно, этот код объяснит более четко:

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.") никогда не будут использованы.

...