Преобразуйте TIFF-изображение в String для публикации в виде двоичного приложения / потока октетов (C ++)

0

Я использую 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);

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

  • 0
    Вы не можете использовать printf так, как используете его для отображения строки, содержащей встроенные нули.
  • 0
    Да, printf остался от чего-то другого. Я просматриваю String в отладчике визуальной студии
Показать ещё 4 комментария
Теги:
post
http
c-strings

1 ответ

2
Лучший ответ

Вы не можете использовать функции, которые используют нуль в качестве ограничителя строк:

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

  • 0
    Почему вы пишете strlen(aStdString.c_str()) oO
  • 0
    Отлично, это решило проблему! Спасибо!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню