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

Qt

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

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

28.12.2016, 14:52. Просмотров 465. Ответов 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?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2016, 14:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сформировать post запрос для отправки файла на сервер (C++ Qt):

QNetworkAccessManager POST запрос для авторизации - C++ Qt
Только начала осваивать QNetworkAccessManager... Подскажите, пожалуйста, как правильно оформлять postData при вызове метода post(request,...

Отправка файла на сервер через POST запрос - C#
Нужно отправить .txt файл на сервер, как это можно реализовать?

Имитация POST для отправки файла - PHP Сети
Есть такая форма для отправки файлов на сервер: <form action="my.com/my.php" method="post" enctype="multipart/form-data"> <input...

Составить запрос для отправки на сервер, по инструкции - C#
Народ, помогите составить, вот как выглядит описание: Я вот что пока написал: public class SomewhereSender { ...

Переделать программу для отправки файла на сервер - VBA
Option Explicit Sub FTPFile() On Error GoTo Err_FTPFile Dim sHost As String Dim sUser As String Dim sPass As...

POST запрос на сервер - PHP
Здравствуйте. Задумался вот над чем. Для того, чтобы получить данные с какого-нибудь сервера при помощи file_get_contents(), надо указать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ArmanPrestige
Pied Piper
232 / 223 / 51
Регистрация: 15.01.2013
Сообщений: 849
Завершенные тесты: 1
30.12.2016, 15:54 #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: хм, мне кажется или форум ломает экранирование?
1
trdm
173 / 27 / 5
Регистрация: 29.01.2013
Сообщений: 176
30.12.2016, 16:44 #3
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
FYI: хм, мне кажется или форум ломает экранирование?
добавь исходник в зипе.
0
nd2
2259 / 1831 / 639
Регистрация: 29.01.2016
Сообщений: 5,905
30.12.2016, 23:12 #4
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
мне кажется или форум ломает экранирование?
Или.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
05.01.2017, 13:38 #5
_Колючий_, зачем вы руками делаете?
Есть специальные классы для POST- multipart QHttpMultiPart, QHttpPart

http://avazart.zz.mu/2013/09/qnetworkaccessmanager/
0
_Колючий_
4 / 4 / 2
Регистрация: 05.08.2012
Сообщений: 109
06.01.2017, 02:57  [ТС] #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://

И все прекрасно заработало
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
06.01.2017, 12:06 #7
Цитата Сообщение от _Колючий_ Посмотреть сообщение
Но конкретно на том сервере (CivetWeb, если точнее), с которым нужно было установить соединение работать не захотело.
По какой причине?
0
_Колючий_
4 / 4 / 2
Регистрация: 05.08.2012
Сообщений: 109
08.01.2017, 11:38  [ТС] #8
Цитата Сообщение от Avazart Посмотреть сообщение
По какой причине?
Я больше всего склонен грешить на разделитель. По-крайней мере, когда я прогонял запросы через wireshark он какой-то не понятный был. И сервер сообщал, что post запрос он принял, но не видит полей формы.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
08.01.2017, 14:10 #9
А чего гадаете, возьмите и сравните с запросом браузера.
Может Вы поля не правильно заполнили.
Цитата Сообщение от _Колючий_ Посмотреть сообщение
wireshark
Лучше использовать HTTPAnalizer7
0
_Колючий_
4 / 4 / 2
Регистрация: 05.08.2012
Сообщений: 109
08.01.2017, 19:51  [ТС] #10
Цитата Сообщение от Avazart Посмотреть сообщение
А чего гадаете, возьмите и сравните с запросом браузера.
Может Вы поля не правильно заполнили.
Собственно, это было первое, что я сделал

Цитата Сообщение от Avazart Посмотреть сообщение
Лучше использовать HTTPAnalizer7
Преимущества?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 19:51
Привет! Вот еще темы с ответами:

Post запрос на сервер - JavaScript
Здравствуйте. Как отправить POST запрос, например на сервер вк, средствами JavaScript.

POST - запрос на сервер - Программирование Android
Суть задачи: при нажатии на кнопку пост-запросом отправляется переменная со значением. Проблема: при нажатии на кнопку приложение...

Post запрос на сервер - C++ Builder
Доброго дня.Программа не много не стандартная - но прошу помощи. Хочу накрутить количество просмотров страницы(получить сертификат на...

Запрос на сервер POST/GET - Java EE
Мне надо передать информацию на сервер. Код взял здесь. Как я понял в строке String urlParameters =...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.01.2017, 19:51
Ответ Создать тему
Опции темы

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