Название: QHttp Отправлено: kadr от Январь 26, 2010, 09:34 Привет всем, народ есть задачка, надо отправить файл по http протоколу, методом post :
Исходя из справки: Код: http.setHost("http://192.168.1.223"); Содержимое файла file_load.php Код: <?php Код: <HTML> Название: Re: QHttp Отправлено: SimpleSunny от Январь 26, 2010, 10:05 Необходимо переходить на QNetworkAccessManager, так как QHttp больше не поддерживается.
А если по вопросу, то где-то так: Код: QHttpRequestHeader header; Название: Re: QHttp Отправлено: Sahab от Январь 26, 2010, 10:28 "This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code."
Вообще-то поддерживается... хоть и рекомендуют пользоваться новым Название: Re: QHttp Отправлено: kibsoft от Январь 26, 2010, 10:39 Цитировать "This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code." Вообще-то он предоставляется, но больше не поддерживается :)Вообще-то поддерживается... хоть и рекомендуют пользоваться новым Название: Re: QHttp Отправлено: kadr от Январь 26, 2010, 10:42 Хорошо, я внял совету и полазил в интернете в поисках описалова по QNetworkAccessManager, кое что нашел:
Код: QNetworkAccessManager manager; Название: Re: QHttp Отправлено: kibsoft от Январь 26, 2010, 10:52 Код: qDebug()<<connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished())); Название: Re: QHttp Отправлено: Sahab от Январь 26, 2010, 10:53 ($QTDIR)\examples\network\downloadmanager\
Название: Re: QHttp Отправлено: kadr от Январь 26, 2010, 10:55 Код: qDebug()<<connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished())); Название: Re: QHttp Отправлено: kadr от Январь 26, 2010, 11:05 ($QTDIR)\examples\network\downloadmanager\ В целом тоже самое что и у меня!Название: Re: QHttp Отправлено: kadr от Январь 26, 2010, 11:10 Дело в том, что там описано как скачать что, от куда-то, а мне надо передать файл!
Название: Re: QHttp Отправлено: Sahab от Январь 26, 2010, 11:21 а где в Вашем коде идет передача содержимого файла?
Название: Re: QHttp Отправлено: Sahab от Январь 26, 2010, 11:23 QNetworkReply * QNetworkAccessManager::post ( const QNetworkRequest & request, const QByteArray & data )
This is an overloaded function. Sends the contents of the data byte array to the destination specified by request. + http://ru.wikipedia.org/wiki/HTTP Название: Re: QHttp Отправлено: kadr от Январь 26, 2010, 11:36 apiUrl = "http://192.168.1.223/farma/file_load.php";
QNetworkRequest request(apiUrl); reply = manager.post(request, &myfile); qDebug()<< connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished())); qDebug()<< connect(reply, SIGNAL(readyRead()), this, SLOT(readyReadReply())); qDebug()<< reply->errorString(); Название: Re: QHttp Отправлено: voronElf от Январь 26, 2010, 11:40 По теме SimpleSunny +1
подход все по протоколу, а через QHttp или через QMetworkmanager отсылать разницы нету, кроме того что QHttp нестабилен ))) Для kadr, в коде с QNetworkAccessManager непонятно немного, видно QNetworkAccessManager создается на стеке, но сигналы со слотами связываются по this. Можт в этом и трабла, что ответов сервака не получаешь. Нужно чтобы менеджер существовал все время пока ходят запросы и приходят-отрабатываются ответы http. У меня была подобная задача давненько уже, жаль совета подобного коду от SimpleSunny не увидел в нужное время а сделал так: брал данные файла, совал в пост без изменений, с Content-type: application/octet-stream (чтоб разбора пост на сервере не было перед выполнением скрипта-приемщика). Скрипт-приемщик писал сам, брал $_HTTP_RAW_POST_DATA и все нормально проканывало. P.S. можт потому что немного не по протоколу поступал, в Qt 4.5.2 при такой отправке через прокси запрос не проходил до сервака, а без прокси нормально ходил. Название: Re: QHttp Отправлено: Sahab от Январь 26, 2010, 11:52 а это к чему было?
... requestString = "method=getQuote&format=csv"; ... и м.б. QNetworkAccessManager *manager = new QNetworkAccessManager(this); ? Название: Re: QHttp Отправлено: kadr от Январь 26, 2010, 11:55 а это к чему было? Это я в нете пример нашел! Так и написал, попробовал! ... requestString = "method=getQuote&format=csv"; ... Название: Re: QHttp Отправлено: SimpleSunny от Январь 26, 2010, 12:08 Тут написано как именно отправляют в таком случае файлы, есть даже ссылка на RFC.
http://www.intuit.ru/department/internet/html/17/11.html А если поиском по форуму "multipart/form-data", то тоже можно найти множество примеров. Название: Re: QHttp Отправлено: kadr от Январь 29, 2010, 08:48 Народ, как скачать много файлов с сервера, у меня получатся скачать только один первый!
Код: void nomkl_num::getfiles() Название: Re: QHttp Отправлено: kadr от Февраль 01, 2010, 12:30 Народ, ну подскажите, как мне лучше скачать файли с сервака, посоветуйте чем, qhttp, или может лучше qftp, пожалуста! Изрыл весь инет, перепробовал все что там нашел, все равно не получается!
Название: Re: QHttp Отправлено: Alex Custov от Февраль 02, 2010, 00:33 Ты сначала разбери свой код, например, что делает этот слот. Объясни так подробно как сможешь.
Код
Название: Re: QHttp Отправлено: kadr от Февраль 02, 2010, 11:18 Ты сначала разбери свой код, например, что делает этот слот. Объясни так подробно как сможешь. В этом слоте я пытался сохранять содержимое http_save в локальную копию файла. Одним словом при старте программы у меня происходит чтение всех файлов на серваке, для этого использую файлик написанный на php, который лежит на сервере spisok_files.php:Код
Код: QHttpRequestHeader header("GET", "/farma/spisok_files.php"); Происходит конект со слотом getfiles(), в котором в дальнейшем происходит соединение со слотом savefiles(): Код: int i = 0; Скажите, вообще есть смысл использовать http протокол для скачивания файлов с сервера, общим количеством в 30 - 33 файла, или есть смысл использовать что то иное, например ftp протокол, или еще что то? Основная задача: тупо скачать все файлы с сервака на локальный компьютер! Название: Re: QHttp Отправлено: Alex Custov от Февраль 02, 2010, 14:54 В этом слоте я пытался сохранять содержимое http_save в локальную копию файла. Одним словом при старте программы у меня происходит чтение всех файлов на серваке, для этого использую файлик написанный на php, который лежит на сервере spisok_files.php: То есть, читается общее количество файлов и пытаюсь в цикле сохранить содержимое всех файлов на серваке в отдельные файлы на локальном компьютер. Но получается, что сохраняется только первый файл! Скажите, вообще есть смысл использовать http протокол для скачивания файлов с сервера, общим количеством в 30 - 33 файла, или есть смысл использовать что то иное, например ftp протокол, или еще что то? Основная задача: тупо скачать все файлы с сервака на локальный компьютер! Ты так и не увидел ничего зазороного? До этого ты в цикле делаешь Код У тебя создаётся например 20 QHttp объектов, завязанных на один слот. А в слоте ты читаешь этот указатель Код
И который же из 20-ти QHttp объектов тут будет всё время вызываться? Самый последний созданный! Слот как минимум надо переделать в Код
Косяков там ещё хватает... Название: Re: QHttp Отправлено: kadr от Февраль 03, 2010, 14:09 Переделал, сделал так как написали, он создает все файлы на локальном компе, но в файлах вот что:
Bad Request Your browser sent a request that this server could not understand. ------------------------------------ Apache/2.2.3 (CentOS) Server at 192.168.1.223 Port 80 во всех! Название: Re: QHttp Отправлено: kadr от Февраль 03, 2010, 14:47 Никак не вкурю, как скачивать файлы с http сервака, начну сначала по этапно:
1. По нажатию на кнопку происходить следущее: Код: void nomkl_num::on_get_files_triggered() Код: void nomkl_num::getfiles() Код: void nomkl_num::savefiles(bool err) Bad Request Your browser sent a request that this server could not understand. ------------------------------------ Apache/2.2.3 (CentOS) Server at 192.168.1.223 Port 80 Название: Re: QHttp Отправлено: Alex Custov от Февраль 03, 2010, 18:41 Никак не вкурю, как скачивать файлы с http сервака, начну сначала по этапно: Поэтапно это делается не так. Надо написать сначала самый простой пример, который скачивает один какой-то строго заданный файл, и разобраться сначала с ним. Потом уже качать список файлов. Сейчас сервер тебе говорит что ты передал неправильные параметры в запросе. Сделай запрос браузером, и поснифай что он отправляет и что отвечает сервер. Название: Re: QHttp Отправлено: kadr от Февраль 04, 2010, 09:35 Блин, я не пойму никак, почему вот этот запрос отрабатывает как надо:
Код: void nomkl_num::on_get_files_triggered() Код: QHttpRequestHeader header("GET", "farma/zagruzup00000000001.dlb"); Название: Re: QHttp Отправлено: SimpleSunny от Февраль 04, 2010, 11:16 Попробуй добавить слеш
QHttpRequestHeader header("GET", "/farma/zagruzup00000000001.dlb"); Название: Re: QHttp Отправлено: kadr от Февраль 04, 2010, 12:01 Пробывал, ругается, что такого файла вообще нет! И вообще я думаю что резонее использовать QNetworkAccessManager.
Вот код: Код: void nomkl_num::on_get_files_triggered()//нажатие кнопки в меню - загрузить Название: Re: QHttp Отправлено: BRE от Февраль 04, 2010, 13:31 А как он может работать, если
QNetworkAccessManager manager; определен на стеке и соответственно разрушается при выходе из метода? :) Название: Re: QHttp Отправлено: kadr от Февраль 04, 2010, 13:38 о Спасибо!
Название: Re: QHttp Отправлено: kadr от Февраль 04, 2010, 15:06 Но это еще не все, скачать один фаилик у меня получилось, вопрос, как мне скачать много файлов, загоняю в цикл:
Код: while(i != sp.count()) Название: Re: QHttp Отправлено: crossly от Февраль 04, 2010, 15:34 а как с слот readyRead определяет в какой файл писать??
Название: Re: QHttp Отправлено: kadr от Февраль 04, 2010, 15:40 а как с слот readyRead определяет в какой файл писать?? file.setFileName("files/"+sp.value(i));file.open(QIODevice::WriteOnly); Название: Re: QHttp Отправлено: crossly от Февраль 04, 2010, 15:45 ладно... по другому... как ты определяешь где заканчиваются данные одного файла и начинаются другого.... я не работал accessmanager'ом .... но что то мне подсказывает что работает это дело в асинхронном режиме...
Название: Re: QHttp Отправлено: kadr от Февраль 04, 2010, 18:50 ладно... по другому... как ты определяешь где заканчиваются данные одного файла и начинаются другого.... я не работал accessmanager'ом .... но что то мне подсказывает что работает это дело в асинхронном режиме... Вот за этим я суда и обратился, у меня получается скачать только 1 файл, а мне надо много, кто в курсе как это осуществить, помогите!Название: Re: QHttp Отправлено: voronElf от Февраль 05, 2010, 07:05 ну если проблема только в том, чтобы разделить файлы, а само скачивание файла реализовано, тогда можно предложить 2 подхода:
1. Для случая если ты из одного цикла запускаешь кучу закачек на все файлы, тогда надо формировать в памяти структуру соответствия экземпляра (адреса) QNetworkReply с именем файла. Например QMap<QNetworkReply*, QString> как внутренняя переменная класса (конечно не на стеке ее делать). Слот-приемщик данных по адресу QNetworkReply* будет определять в какой файл писать данные. 2. Качаешь файлы один за другим. Запускаешь скачивание первого файла, в слоте получения данных пишешь данные в текущий файл. Здесь же в слоте запускаешь скачивание второго файла и так далее пока список файлов не кончится. Название: Re: QHttp Отправлено: kadr от Февраль 05, 2010, 13:34 ну если проблема только в том, чтобы разделить файлы, а само скачивание файла реализовано, тогда можно предложить 2 подхода: Вот про второй можно маленько поподробнее! Как запустить скачивание второго и последующих файлов, не представляю!2. Качаешь файлы один за другим. Запускаешь скачивание первого файла, в слоте получения данных пишешь данные в текущий файл. Здесь же в слоте запускаешь скачивание второго файла и так далее пока список файлов не кончится. Код: void nomkl_num::readyRead() Название: Re: QHttp Отправлено: voronElf от Февраль 05, 2010, 14:30 я делал так: отдельный метод класса (назовем send() ), отправляющий запрос на очередной файл. В слоте повешенном на сигнал finished в самом конце после всех обработок делаю вызов send()
Название: Re: QHttp Отправлено: kadr от Февраль 08, 2010, 16:16 Попробовал сделать так, выскакивает ошибка
Код: void nomkl_num::send_save_file() Название: Re: QHttp Отправлено: voronElf от Февраль 09, 2010, 06:33 несколько моих имхо по коду:
1. зачем перемещать объекты в треды какие-то, запрос итак асинхронно выполняется в другом треде, это скрыто в реализации managera. 2. request у меня локальная переменная на стеке функции (ну тут большой разницы не должно быть). 3. коннект сигнала finished от manager достаточно сделать один раз (в конструкторе), а не при каждом вызове send () 4. открывать файл в одном слоте и закрывать в другом не есть хорошо (файл может и не закрыться), мне проще reply->readAll() делать в finished и писать в файл в этом же слоте. Ну а теперь почему не останавливается - в коде не вижу условия на остановку процесса. Получается же своего рода рекурсия: 1-я функция порождает вызов второй, вторая в свою очередь явно вызывает первую. Если не прописать явного условия выхода - конечно бесконечный цикл получим. А условие выхода такое: в функции send() если список файлов закончился, то не отправлять очередной запрос, а возврат. Список файлов я так понимаю это sp, кстати имя скачанного файла как то эстетичнее из этого списка и брать (текущую позицию знаем), а не из url вырезать. PS: поборешь зависание, там можт и видно станет, почему не все файлы скачивает Название: Re: QHttp Отправлено: kadr от Февраль 09, 2010, 15:12 Спасибо, вреде сделал, надо было этот send(), в моем случае send_save_file(), не на finished вешать, а на readyRead().
Код: QStringList sl; Название: Re: QHttp Отправлено: voronElf от Февраль 10, 2010, 06:29 можно и все на readyRead повешать, можно на finished. Я предпочел 2-й вариант, из-за того что reply нужно удалять ручками. Тема поднималась тут (http://www.prog.org.ru/topic_11717_0.html)
|