Russian Qt Forum
Апрель 29, 2024, 02:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QHttp  (Прочитано 22650 раз)
kadr
Гость
« Ответ #15 : Январь 26, 2010, 11:55 »

а это к чему было?
...
requestString = "method=getQuote&format=csv";
...
Это я в нете пример нашел! Так и написал, попробовал!
Записан
SimpleSunny
Гость
« Ответ #16 : Январь 26, 2010, 12:08 »

Тут написано как именно отправляют в таком случае файлы, есть даже ссылка на RFC.
http://www.intuit.ru/department/internet/html/17/11.html

А если поиском по форуму "multipart/form-data", то тоже можно найти множество примеров.
Записан
kadr
Гость
« Ответ #17 : Январь 29, 2010, 08:48 »

Народ, как скачать много файлов с сервера, у меня получатся скачать только один первый!
Код:
void nomkl_num::getfiles()
{
    int i = 0;

    QStringList st;
    QString str,file_str;
    str = http_sp->readAll();
    st = str.split("\n");
    while (i !=  st.count())
    {
        file_str = st.value(i);
        if (file_str != "..")
        {
            if (file_str != ".")
            {
                if (file_str != "")
                {
                    sp.append(file_str);
                }
            }           
        }
        i++;
    }

   i = 0;

   while(i != sp.count())
   {
        QHttpRequestHeader header("GET", "/farma/zagruz/"+sp.value(i));
        header.setValue("Host", "192.168.1.223");
        header.setValue("Content-type", "multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n");
        header.setValue( "User-Agent", "User Agent");
        header.setContentType("application/x-www-form-urlencoded");
        http_save = new QHttp(this);
        connect(http_save, SIGNAL(done(bool)), this, SLOT(savefiles()));
        http_save->setHost("192.168.1.223");
        http_save->request(header);
        i++;
    }
}

void nomkl_num::savefiles()
{
    QDir dir;
    bool ok;

    QFile file("files/"+sp.value(zakaz));
    zakaz++;
    file.open(QIODevice::WriteOnly);
    file.write(http_save->readAll().trimmed());
    file.close(); 
}
Записан
kadr
Гость
« Ответ #18 : Февраль 01, 2010, 12:30 »

Народ, ну подскажите, как мне лучше скачать файли с сервака, посоветуйте чем, qhttp, или может лучше qftp, пожалуста! Изрыл весь инет, перепробовал все что там нашел, все равно не получается!
« Последнее редактирование: Февраль 01, 2010, 14:42 от kadr » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #19 : Февраль 02, 2010, 00:33 »

Ты сначала разбери свой код, например, что делает этот слот. Объясни так подробно как сможешь.

Код
C++ (Qt)
void nomkl_num::savefiles()
{
   QDir dir;
   bool ok;
 
   QFile file("files/"+sp.value(zakaz));
   zakaz++;
   file.open(QIODevice::WriteOnly);
   file.write(http_save->readAll().trimmed());
   file.close();  
}
 
Записан
kadr
Гость
« Ответ #20 : Февраль 02, 2010, 11:18 »

Ты сначала разбери свой код, например, что делает этот слот. Объясни так подробно как сможешь.

Код
C++ (Qt)
void nomkl_num::savefiles()
{
   QDir dir;
   bool ok;
 
   QFile file("files/"+sp.value(zakaz));
   zakaz++;
   file.open(QIODevice::WriteOnly);
   file.write(http_save->readAll().trimmed());
   file.close();  
}
 
В этом слоте я пытался сохранять содержимое http_save в локальную копию файла. Одним словом при старте программы у меня происходит чтение всех файлов на серваке, для этого использую файлик написанный на php, который лежит на сервере spisok_files.php:
Код:
QHttpRequestHeader header("GET", "/farma/spisok_files.php");
    header.setValue("Host", "192.168.1.223");
    header.setValue("Content-type", "multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n");
    header.setValue( "User-Agent", "User Agent");
    header.setContentType("application/x-www-form-urlencoded");
    http_sp = new QHttp(this);
    connect(http_sp, SIGNAL(done(bool)), this, SLOT(getfiles()));
    http_sp->setHost("192.168.1.223");
    http_sp->request(header);

Происходит конект со слотом getfiles(), в котором в дальнейшем происходит соединение со слотом savefiles():
Код:
int i = 0;
    QStringList st;
    QString str,file_str;
    str = http_sp->readAll();
    st = str.split("\n");
    while (i !=  st.count())
    {
        file_str = st.value(i);
        if (file_str != "..")
        {
            if (file_str != ".")
            {
                if (file_str != "")
                {
                    sp.append(file_str);
                }
            }            
        }
        i++;
    }

   i = 0;

while(i != sp.count())
   {
        QHttpRequestHeader header("GET", "/farma/zagruz/"+sp.value(i));
        header.setValue("Host", "192.168.1.223");
        header.setValue("Content-type", "multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n");
        header.setValue( "User-Agent", "User Agent");
        header.setContentType("application/x-www-form-urlencoded");
        http_save = new QHttp(this);
        connect(http_save, SIGNAL(done(bool)), this, SLOT(savefiles()));
        http_save->setHost("192.168.1.223");
        http_save->request(header);
    }
То есть, читается общее количество файлов и пытаюсь в цикле сохранить содержимое всех файлов на серваке в отдельные файлы на локальном компьютер. Но получается, что сохраняется только первый файл!
Скажите, вообще есть смысл использовать http протокол для скачивания файлов с сервера, общим количеством в 30 - 33 файла, или есть смысл использовать что то иное, например ftp протокол, или еще что то?  
Основная задача: тупо скачать все файлы с сервака на локальный компьютер!
« Последнее редактирование: Февраль 02, 2010, 11:25 от kadr » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #21 : Февраль 02, 2010, 14:54 »

В этом слоте я пытался сохранять содержимое http_save в локальную копию файла. Одним словом при старте программы у меня происходит чтение всех файлов на серваке, для этого использую файлик написанный на php, который лежит на сервере spisok_files.php:

То есть, читается общее количество файлов и пытаюсь в цикле сохранить содержимое всех файлов на серваке в отдельные файлы на локальном компьютер. Но получается, что сохраняется только первый файл!
Скажите, вообще есть смысл использовать http протокол для скачивания файлов с сервера, общим количеством в 30 - 33 файла, или есть смысл использовать что то иное, например ftp протокол, или еще что то?  
Основная задача: тупо скачать все файлы с сервака на локальный компьютер!

Ты так и не увидел ничего зазороного? До этого ты в цикле делаешь

Код
C++ (Qt)
http_save = new QHttp(this);
У тебя создаётся например 20 QHttp объектов, завязанных на один слот. А в слоте ты читаешь этот указатель

Код
C++ (Qt)
file.write(http_save->readAll().trimmed());
 

И который же из 20-ти QHttp объектов тут будет всё время вызываться? Самый последний созданный! Слот как минимум надо переделать в

Код
C++ (Qt)
void nomkl_num::savefiles(bool err)
{
   if(err)
   {
       qDebug("Error occured");
       return;
   }
 
   QHttp *http = qobject_cast<QHttp *>(sender());
 
   if(!http)
   {
       qDebug("Cannot cast to QHttp");
       return;
   }
 
   // если zakaz == 1, это не означает что скачался файл sp.value(1)
   QFile file("files/"+sp.value(zakaz));
 
   zakaz++;
 
   if(!file.open(QIODevice::WriteOnly))
   {
       qDebug("Cannot open file for writing");
       return;
   }
 
   file.write(http->readAll().trimmed());
   file.close();  
}
 

Косяков там ещё хватает...
Записан
kadr
Гость
« Ответ #22 : Февраль 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
во всех!
Записан
kadr
Гость
« Ответ #23 : Февраль 03, 2010, 14:47 »

Никак не вкурю, как скачивать файлы с http сервака, начну сначала по этапно:
1. По нажатию на кнопку происходить следущее:
Код:
void nomkl_num::on_get_files_triggered()
{
    QHttpRequestHeader header("GET", "/farma/spisok_files.php");
    header.setValue("Host", "192.168.1.223");
    header.setValue("Content-type", "multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n");
    header.setValue( "User-Agent", "User Agent");
    header.setContentType("application/x-www-form-urlencoded");
    http_sp = new QHttp(this);
    connect(http_sp, SIGNAL(done(bool)), this, SLOT(getfiles()));
    http_sp->setHost("192.168.1.223");
    http_sp->request(header);
}
2. Затем из через connect переходим к следующему слоту getfiles(), в котором я получаю список файлов на серваке, и запихиваю этот список в переменную, а также в этом слоте, в цикле происходит считивание содержимого каждого файла по отдельности и передача этого содержимого в следующий слот savefiles(bool):
Код:
void nomkl_num::getfiles()
{
    int i = 0;    
    QStringList st;
    QString str,file_str;
    str = http_sp->readAll();
    st = str.split("\n");
    while (i !=  st.count())
    {
        file_str = st.value(i);
        if (file_str != "..")
        {
            if (file_str != ".")
            {
                if (file_str != "")
                {
                    sp.append(file_str);
                }
            }
        }
        i++;
    }
   i = 0;
   while (i != sp.count())
   {
        QHttpRequestHeader header_s("GET", "farma/"+sp.value(i));
        header_s.setValue("Host", "192.168.1.223");
        header_s.setValue("Content-type", "multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n");
        header_s.setValue( "User-Agent", "User Agent");
        header_s.setContentType("application/x-www-form-urlencoded");
        http = new QHttp(this);
        http->setHost("192.168.1.223");
        connect(http, SIGNAL(done(bool)), this, SLOT(savefiles(bool)));
        http->request(header_s);
        i++;
   }
}
далее слот savefiles(bool err)
Код:
void nomkl_num::savefiles(bool err)
{
    if(err)
        {
            qDebug() << "Error occured";
            return;
        }

        QHttp *http = qobject_cast<QHttp *>(sender());

        if(!http)
        {
            qDebug() << "Cannot cast to QHttp";
            return;
        }

        // если zakaz == 1, это не означает что скачался файл sp.value(1)

        QFile file("files/"+sp.value(zakaz));

        zakaz++;

        if(!file.open(QIODevice::WriteOnly))
        {
            qDebug() << "Cannot open file for writing";
            return;
        }

        file.write(http->readAll().trimmed());
        file.close();
}
Вот впринципе и все, и на выходе получаю, что файлы как бы скачаны, то есть названия у всех правильные, но содержимое всех файлов одинаковое и вот что там написано:
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
« Последнее редактирование: Февраль 03, 2010, 14:48 от kadr » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #24 : Февраль 03, 2010, 18:41 »

Никак не вкурю, как скачивать файлы с http сервака, начну сначала по этапно:

Поэтапно это делается не так. Надо написать сначала самый простой пример, который скачивает один какой-то строго заданный файл, и разобраться сначала с ним. Потом уже качать список файлов. Сейчас сервер тебе говорит что ты передал неправильные параметры в запросе. Сделай запрос браузером, и поснифай что он отправляет и что отвечает сервер.
« Последнее редактирование: Февраль 03, 2010, 19:55 от Alex Custov » Записан
kadr
Гость
« Ответ #25 : Февраль 04, 2010, 09:35 »

Блин, я не пойму никак, почему вот этот запрос отрабатывает как надо:
Код:
void nomkl_num::on_get_files_triggered()
{
    QHttpRequestHeader header("GET", "/farma/spisok_files.php");
    header.setValue("Host", "192.168.1.223");
    header.setValue("Content-type", "multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n");
    header.setValue( "User-Agent", "User Agent");
    header.setContentType("application/x-www-form-urlencoded");
    http_sp = new QHttp(this);
    connect(http_sp, SIGNAL(done(bool)), this, SLOT(getfiles()));
    http_sp->setHost("192.168.1.223");
    http_sp->request(header);
}
возвращает мне содержимое страницы spisok_files.php, а этот не срабатывает:
Код:
        QHttpRequestHeader header("GET", "farma/zagruzup00000000001.dlb");
        header.setValue("Host", "192.168.1.223");
        header.setValue("Content-type", "multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n");
        header.setValue( "User-Agent", "User Agent");
        header.setContentType("application/x-www-form-urlencoded");
        http = new QHttp(this);
        connect(http, SIGNAL(done(bool)), this, SLOT(savefiles(bool)));
        http->setHost("192.168.1.223");        
        http->request(header);
не работает, в чем разница то, все тоже самое, только прошу отобразить содержимое файла!
« Последнее редактирование: Февраль 04, 2010, 10:26 от kadr » Записан
SimpleSunny
Гость
« Ответ #26 : Февраль 04, 2010, 11:16 »

Попробуй добавить слеш
QHttpRequestHeader header("GET", "/farma/zagruzup00000000001.dlb");
Записан
kadr
Гость
« Ответ #27 : Февраль 04, 2010, 12:01 »

Пробывал, ругается, что такого файла вообще нет! И вообще я думаю что резонее использовать QNetworkAccessManager.
Вот код:
Код:
void nomkl_num::on_get_files_triggered()//нажатие кнопки в меню - загрузить
{


        QNetworkRequest request;  // Формируем запрос
        request.setUrl(QUrl("192.168.1.223/farma/zotchet.php"));
        QNetworkAccessManager manager;
        manager.moveToThread(QApplication::instance()->thread());
        reply = manager.get(request); //Отправляем запрос
        reply->moveToThread(QApplication::instance()->thread());
        connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
        connect(reply,SIGNAL(readyRead()),this,SLOT(readyRead()));


}

//------------------------------------------------------------------------------------------------------------------------------------------------------

void nomkl_num::readyRead()
{
    file.setFileName("files/123.txt");
    file.open(QIODevice::WriteOnly);

    qDebug() << reply->readAll();
    file.write(reply->readAll());

}

void nomkl_num::replyFinished(QNetworkReply *)
{
    if (reply->error())
       {
           qDebug() << "error download" << reply->errorString();
           QCoreApplication::quit();
       }else
       {
           qDebug() << "download complete";
           file.close();
           QCoreApplication::quit();
       }
}
и все равно не работает.
« Последнее редактирование: Февраль 04, 2010, 12:11 от kadr » Записан
BRE
Гость
« Ответ #28 : Февраль 04, 2010, 13:31 »

А как он может работать, если
QNetworkAccessManager manager;

определен на стеке и соответственно разрушается при выходе из метода?  Улыбающийся
« Последнее редактирование: Февраль 04, 2010, 13:39 от BRE » Записан
kadr
Гость
« Ответ #29 : Февраль 04, 2010, 13:38 »

о Спасибо!
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.134 секунд. Запросов: 22.