Форум программистов, компьютерный форум CyberForum.ru

Qt

Войти
Регистрация
Восстановить пароль
 
_Колючий_
4 / 4 / 2
Регистрация: 05.08.2012
Сообщений: 105
#1

Сформировать post запрос для отправки файла на сервер - C++ Qt

28.12.2016, 14:52. Просмотров 395. Ответов 9
Метки нет (Все метки)

Задача следующая. Есть web-сервер, на который необходимо отправить файл. Для этого необходимо составить запрос следующего вида:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[url]http://192.168.193.91:8081/upload_test[/url]
 
POST /upload_test HTTP/1.1
Host: 192.168.193.91:8081
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------1774597465133387988027871907
Content-Length: 227
-----------------------------1774597465133387988027871907
Content-Disposition: form-data; name="some"; filename="file.txt"
Content-Type: text/plain
 
some data 
 
-----------------------------1774597465133387988027871907--
 
HTTP/1.0 200 OK
Content-Type: text/plain
Такой запрос получается, если файл отправить с помощью html формы (файл приходит).

Попробовал на Qt вот так - не получилось.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
bool InstrumentController::uploadTest(QFile* file)
{
    bool success = false;
 
    QFileInfo fileInfo(*file);
    QNetworkRequest request(url.url() + "/upload_test"); //our server with php-script
 
    QString bound="-----------------------------1774597465133387988027871907"; //name of the boundary
    QByteArray data;
 
    data.append("--" + bound + "\r\n"); //according to rfc 1867
    //data.append("Content-Disposition: form-data; name="upload"; filename="" + file->fileName() + ""\r\n");
    data.append("Content-Disposition: form-data; name="upload"; filename="file.txt"\r\n");
 
    data.append("Content-Type: text/plane\r\n\r\n");
 
    if (!file->open(QIODevice::ReadOnly))
        return false;
    data.append(file->readAll()); //let's read the file
    data.append("\r\n");
    data.append("-----------------------------1774597465133387988027871907--\r\n"); //closing boundary
 
 
    request.setRawHeader("Content-Type","multipart/form-data; boundary=-----------------------------1774597465133387988027871907");
    request.setRawHeader("Content-Length", QString::number(data.length()).toUtf8());
 
    //connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(sendingFinished(QNetworkReply*)));
    QNetworkReply *reply = networkManager.post(request,data);
 
 
    //Ожидание окончания запроса
    QEventLoop loop;
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
 
    //Проверка на то, что запрос прошел
    if (reply->error() == QNetworkReply::NoError  )
    {
        QString data = reply->readAll();
        qDebug(data.toStdString().c_str());
        success = true;
    }
    else
        success = false;
 
    reply->deleteLater();
    file->close();
    return true;
}
В чем может быть проблема и как вообще сформировать такой же заголовок, но из под Qt?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2016, 14:52     Сформировать post запрос для отправки файла на сервер
Посмотрите здесь:
C++ Qt QNetworkAccessManager POST запрос для авторизации
Отправка картинки на сервер через post C++ Qt
Post запрос C++ Qt
Post запрос QT 5.8 C++ Qt
C++ Qt Post запрос
C++ Qt Qt Post запрос
Qt Не работает post запрос C++ Qt
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ArmanPrestige
Pied Piper
232 / 223 / 51
Регистрация: 15.01.2013
Сообщений: 849
Завершенные тесты: 1
30.12.2016, 15:54     Сформировать post запрос для отправки файла на сервер #2
Цитата Сообщение от _Колючий_ Посмотреть сообщение
data.append("Content-Disposition: form-data; name="upload"; filename="file.txt"\r\n");
Тут с экранированием проблема у вас.

Я давненько реализовывал подобное. Вроде бы работало. Сохранился исходник. Вот data

C++ (Qt)
1
2
3
4
5
        data.append("--" + boundary() + "\r\n");
        data.append("content-disposition: form-data; name="" + _fileName + ""; filename="" + "123.txt" + ""\r\n");
        data.append("Content-Type: text/plain\r\n\r\n");
        data.append(file.readAll() + "\r\n");
        data.append("--" + boundary() + "\r\n");
вот хидеры

C++ (Qt)
1
2
        r.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data, boundary=" + boundary());
        r.setHeader(QNetworkRequest::ContentLengthHeader, data().length());
Добавлено через 5 минут
FYI: хм, мне кажется или форум ломает экранирование?
trdm
173 / 27 / 5
Регистрация: 29.01.2013
Сообщений: 166
30.12.2016, 16:44     Сформировать post запрос для отправки файла на сервер #3
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
FYI: хм, мне кажется или форум ломает экранирование?
добавь исходник в зипе.
nd2
1979 / 1565 / 543
Регистрация: 29.01.2016
Сообщений: 4,933
30.12.2016, 23:12     Сформировать post запрос для отправки файла на сервер #4
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
мне кажется или форум ломает экранирование?
Или.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,267
Записей в блоге: 17
05.01.2017, 13:38     Сформировать post запрос для отправки файла на сервер #5
_Колючий_, зачем вы руками делаете?
Есть специальные классы для POST- multipart QHttpMultiPart, QHttpPart

http://avazart.zz.mu/2013/09/qnetworkaccessmanager/
_Колючий_
4 / 4 / 2
Регистрация: 05.08.2012
Сообщений: 105
06.01.2017, 02:57  [ТС]     Сформировать post запрос для отправки файла на сервер #6
Цитата Сообщение от Avazart Посмотреть сообщение
_Колючий_, зачем вы руками делаете?
Есть специальные классы для POST- multipart QHttpMultiPart, QHttpPart

http://avazart.zz.mu/2013/09/qnetworkaccessmanager/
Согласен, есть. Но конкретно на том сервере (CivetWeb, если точнее), с которым нужно было установить соединение работать не захотело. Поэтому пришлось вручную.

В конечном итоге взял код вот отсюда:

http://easy-qt.blogspot.ru/2016/07/get-post-qt-542-qt-57.htmlhttp://

И все прекрасно заработало
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,267
Записей в блоге: 17
06.01.2017, 12:06     Сформировать post запрос для отправки файла на сервер #7
Цитата Сообщение от _Колючий_ Посмотреть сообщение
Но конкретно на том сервере (CivetWeb, если точнее), с которым нужно было установить соединение работать не захотело.
По какой причине?
_Колючий_
4 / 4 / 2
Регистрация: 05.08.2012
Сообщений: 105
08.01.2017, 11:38  [ТС]     Сформировать post запрос для отправки файла на сервер #8
Цитата Сообщение от Avazart Посмотреть сообщение
По какой причине?
Я больше всего склонен грешить на разделитель. По-крайней мере, когда я прогонял запросы через wireshark он какой-то не понятный был. И сервер сообщал, что post запрос он принял, но не видит полей формы.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,267
Записей в блоге: 17
08.01.2017, 14:10     Сформировать post запрос для отправки файла на сервер #9
А чего гадаете, возьмите и сравните с запросом браузера.
Может Вы поля не правильно заполнили.
Цитата Сообщение от _Колючий_ Посмотреть сообщение
wireshark
Лучше использовать HTTPAnalizer7
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 19:51     Сформировать post запрос для отправки файла на сервер
Еще ссылки по теме:
C++ Qt Json post запрос
C++ Qt QNetworkAccessManager POST запрос
C++ Qt Post запрос - русский текст
C++ Qt Не удается отправить POST запрос
Как отправить post запрос с куками C++ Qt

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
_Колючий_
4 / 4 / 2
Регистрация: 05.08.2012
Сообщений: 105
08.01.2017, 19:51  [ТС]     Сформировать post запрос для отправки файла на сервер #10
Цитата Сообщение от Avazart Посмотреть сообщение
А чего гадаете, возьмите и сравните с запросом браузера.
Может Вы поля не правильно заполнили.
Собственно, это было первое, что я сделал

Цитата Сообщение от Avazart Посмотреть сообщение
Лучше использовать HTTPAnalizer7
Преимущества?
Yandex
Объявления
08.01.2017, 19:51     Сформировать post запрос для отправки файла на сервер
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru