Я использую C++ Sockets, чтобы сделать HTTP Multipart POST, содержащий TIFF-изображение на сервере. Этот сервер ожидает двоичный октетный поток.
Я пробовал это:
// Convert out data into a string that can be appended to the body
std::ifstream fin(fileName, std::ios::binary);
std::ostringstream ostrm;
ostrm << fin.rdbuf();
string data(ostrm.str());
К сожалению, я просто получаю II *, когда данные должны быть намного длиннее. Я предполагаю, что данные содержат NULL-символ, который C++ считает, что String завершена. Любые идеи о том, как решить эту проблему?
Если это помогает, это мой код построения тела:
string constructBody(string batchId, string fileString, string fileName) {
string body;
string CRLF = "\r\n";
// first we add the args
body.append("--" + string(BOUNDARY) + CRLF);
body.append("Content-Disposition: form-data; name=\"batch_id\"" + CRLF);
body.append(CRLF);
body.append(batchId + CRLF);
body.append("--" + string(BOUNDARY) + CRLF);
// now we add the file
body.append("Content-Disposition: form-data; name=\"front\"; filename=\"" + string(fileName) + "\"" + CRLF);
body.append("Content-Type: application/octet-stream" + CRLF);
body.append("Content-Transfer-Encording: binary" + CRLF);
body.append(CRLF);
body.append(fileString + CRLF);
body.append("--" + string(BOUNDARY) + "--" + CRLF);
body.append(CRLF);
return body;
}
И вот код публикации:
string body = constructBody(batchId, data, "Front.tif");
char header[1024];
sprintf(header, "POST %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Content-Length: %d\r\n"
"Connection: Keep-Alive\r\n"
"Content-Type: multipart/form-data; boundary=%s\r\n"
"Accept-Charset: utf-8\r\n\r\n", RECEIVER, IP, strlen(body.c_str()), BOUNDARY);
int p = send(dataSock, header, strlen(header), 0);
int k = send(dataSock, body.c_str(), strlen(body.c_str()), 0);
Заранее спасибо!
Вы не можете использовать функции, которые используют нуль в качестве ограничителя строк:
int k = send(dataSock, body.c_str(), strlen(body.c_str()), 0);
Вы используете strlen
выше. Это неверно.
Исправление для этого - использовать функцию length()
для std::string
:
int k = send(dataSock, body.c_str(), body.length()), 0);
Вы делаете ту же ошибку в других местах, например, когда вы создаете заголовок:
"Accept-Charset: utf-8\r\n\r\n", RECEIVER, IP, strlen(body.c_str()), BOUNDARY);
должно быть:
"Accept-Charset: utf-8\r\n\r\n", RECEIVER, IP, body.length(), BOUNDARY);
strlen(aStdString.c_str())
oO
printf
так, как используете его для отображения строки, содержащей встроенные нули.