Потерять кусок моих данных, когда я пытаюсь отправить изображение в QByteArray через QNetworkAccessManager в json - PullRequest
0 голосов
/ 23 мая 2019

Я сравнил данные, которые я отправляю и получаю, и оказалось, что конец моих данных, которые я получаю на моем сервере, обрезан, есть ли у QNetworkmanager ограничение длины запроса?

структура фотографии.

typedef struct Photo_{
    std::string name;
    int likes;
    int comments;
    int id;
    int user_id;
QByteArray img_in_bytes;
}photo;

Вот функция, которая преобразует данные в json и отправляет их на сервер.

void MainWindow::send_new_photo_to_server(photo item){
    QJsonDocument doc;

    QNetworkRequest req(url);

    qDebug() << QString::number(item.likes);
    qDebug() << QString::number(item.comments);
    qDebug() << QString::fromStdString(item.name);

    req.setHeader(QNetworkRequest::ContentTypeHeader, "text");
    req.setRawHeader("request-type", "addMainEntity");

    QBuffer buf(&item.img_in_bytes);
    QByteArray img_in_bytes = buf.data().toBase64();

    QJsonObject object;

    object.insert("comments", QString::number(item.comments));
    object.insert("img_in_bytes",QLatin1String(img_in_bytes));
    object.insert("name", QString::fromStdString(item.name));
    object.insert("likes", QString::number(item.likes));

    doc.setObject(object);

    qDebug() << doc.toJson();

    manager->post(req, doc.toJson());

    qDebug() << "here you are";
}

Есть функция, которая обрабатывает запрос. Нет необходимости в функции загрузки, потому что к моменту вызова данные уже обрезаны.

void Server::get_request(){

    i++;
    qDebug() << i << "\n";

    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());

    QString data = socket->readAll();

    socket->waitForBytesWritten(3000);
    qDebug() << "Recieved data: \n" << data;

    this->process_request(data);
}

1 Ответ

0 голосов
/ 23 мая 2019

Мне удалось решить мою проблему, но она будет работать только для передачи данных в формате json. Вот цикл, который читает все фрагменты данных.

Данные - это QByteArray, который содержит данные, отправленные клиентом. Как вы знаете, Json оканчивается на «}», поэтому я читаю данные из сокета, пока не получу последний кусок данных с «}» в конце.

Я знаю, что это очень плохая практика, но это единственное, что сработало.

Напиши мне, если найдешь лучшее решение.

Data =  "";
while(!Data.contains("}")){
    socket->waitForReadyRead();
    Data += socket->readAll();
}
...