Отправьте двоичный файл на сервер, используя сообщение с Qt - PullRequest
7 голосов
/ 21 апреля 2010

В Qt мне нужно отправить файл sqlite (бинарный файл) на сайт, используя сообщение. Поэтому я открываю файл и пытаюсь прочитать его содержимое в QByteArray, который я могу отправить на сервер с помощью QNetworkRequest. Я могу обработать запрос, так как файл отправляется на сервер, но файл просто пуст. Я неправильно читаю содержимое файла sqlite? (Я знаю, что файл исчезает) Можете ли вы увидеть что-то не так с моим кодом?

QByteArray data;
QFile file("database.sqlite");
if (!file.open(QIODevice::ReadWrite))
    return;

QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_6);
in >> data ;

QString boundary;
QByteArray dataToSend; // byte array to be sent in POST

boundary="-----------------------------7d935033608e2";

QString body = "\r\n--" + boundary + "\r\n";
body += "Content-Disposition: form-data; name=\"database\"; filename=\"database.sqlite\"\r\n";
body += "Content-Type: application/octet-stream\r\n\r\n";
body += data;
body += "\r\n--" + boundary + "--\r\n";
dataToSend = body.toAscii();

QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(this);
QNetworkRequest request(QUrl("http://www.mydomain.com/upload.aspx"));
request.setRawHeader("Content-Type","multipart/form-data; boundary=-----------------------------7d935033608e2");
request.setHeader(QNetworkRequest::ContentLengthHeader,dataToSend.size());
connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(sendReportToServerReply(QNetworkReply*)));
QNetworkReply *reply = networkAccessManager->post(request,dataToSend); // perform POST request

Ответы [ 2 ]

7 голосов
/ 23 декабря 2011

Не используйте QString для записи тела, используйте вместо него QByteArray.Тело строки + = данные;в большинстве случаев не будет добавлять весь файл.

data является QByteArray, и при преобразовании в QString будет обрезаться при первом \ 0.Ваш загруженный файл не будет пригоден для использования.

Используйте пример, приведенный в ссылке из одного из ответов.

3 голосов
/ 21 апреля 2010

Вам не нужен QDataStream. Просто сделай

body += file.readAll()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...