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

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

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

Привет всем, народ есть задачка, надо отправить файл по http протоколу, методом post :
Исходя из справки:
Код:
http.setHost("http://192.168.1.223");
http.post("/farma/file_load.php", &file_tr);
Но ничего не получается!
Содержимое файла file_load.php
Код:
<?php
// Загрузка файлов на сервер
// Если register_globals=Off

// Если upload файла
/*if(isset($_FILES["myfile"]))
{ */
$myfile = $_FILES["myfile"]["tmp_name"];
$myfile_name = $_FILES["myfile"]["name"];
$myfile_size = $_FILES["myfile"]["size"];
$myfile_type = $_FILES["myfile"]["type"];
$error_flag = $_FILES["myfile"]["error"];

// Если ошибок не было
if($error_flag == 0)
{
print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>");
print("Имя файла на компьютере пользователя: ".$myfile_name."<br>");
print("MIME-тип файла: ".$myfile_type."<br>");
print("Размер файла: ".$myfile_size."<br><br>");

$catalog = "/work/one/transfer/med_uch/".$myfile_name;
print("Каталог файла: ".$catalog."<br>");
copy($myfile, $catalog);
// Получаем содержимое файла
$fp = fopen($myfile,"r");
$content = fread($fp, filesize($myfile));
fclose($fp);

// Вывод содержимого файла
//print($content);

//} // end of if 2
} // end of if 1
?>
Если делать чере веб интерфейс:
Код:
<HTML>
<TITLE>Post metod</TITLE>
<BODY>
<FORM ENCTYPE="multipart/form-data" ACTION="file_load.php" METHOD=POST>
Paste the file: <INPUT NAME="myfile" TYPE="file"><br>
<p><input type="submit"></p>
</form>
</BODY>
</HTML>
то нормально все работает, файлик отправляется куда нужно, а через прогу не хочет!
Записан
SimpleSunny
Гость
« Ответ #1 : Январь 26, 2010, 10:05 »

Необходимо переходить на QNetworkAccessManager, так как QHttp больше не поддерживается.

А если по вопросу, то где-то так:
Код:
   QHttpRequestHeader header;
    QHttp http;
...
    QByteArray boundary("*ANT34ONN5dbAS56uTA*");
    QByteArray data("MY_FILE");
    //запрос
    QByteArray byte;

    byte.append("--").append(boundary).append("\r\nContent-Disposition: form-data; name=\"method\"\r\n\r\n");
    byte.append("post\r\n--").append(boundary).append("\r\n");
    byte.append("Content-Disposition: form-data; name=\"file\"; filename=\"all.jpg\"\r\n");
    byte.append("Content-Type: image/jpeg\r\n\r\n");
    byte.append(data).append("\r\n--").append(boundary).append("--");

    header.setValue("Content-Type", QString("multipart/form-data; boundary=").append(boundary));

    http.request(header, byte);
« Последнее редактирование: Январь 26, 2010, 10:09 от SimpleSunny » Записан
Sahab
Гость
« Ответ #2 : Январь 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."
Вообще-то поддерживается... хоть и рекомендуют пользоваться новым
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Январь 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."
Вообще-то поддерживается... хоть и рекомендуют пользоваться новым
Вообще-то он предоставляется, но больше не поддерживается Улыбающийся
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
kadr
Гость
« Ответ #4 : Январь 26, 2010, 10:42 »

Хорошо, я внял совету и полазил в интернете в поисках описалова по QNetworkAccessManager, кое что нашел:
Код:
 QNetworkAccessManager manager;
    QUrl apiUrl;
    QFile file_tr(seting.value("id_uch").toString().trimmed()+"_nomenklatura.csv");
    if (file_tr.open(QIODevice::ReadOnly))
    {
        apiUrl = "http://192.168.1.223/farma/file_load.php";
        requestString = "method=getQuote&format=csv";
        QNetworkRequest request(apiUrl);
        reply = manager.post(request, requestString);
        connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished()));
        connect(reply, SIGNAL(readyRead()), this, SLOT(readyReadReply()));

    }
void nomkl_num::getReplyFinished()
{
    reply->deleteLater();
}

void nomkl_num::readyReadReply()
{
    QString answer = QString::fromUtf8(reply->readAll());
}
Проверил дебагером, соединения вообще не происходит, скажите, как можно передать файл по http протоколу!
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Январь 26, 2010, 10:52 »

Код:
qDebug()<<connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished()));
qDebug()<<connect(reply, SIGNAL(readyRead()), this, SLOT(readyReadReply()));
А ты так проверь есть соединение или нет..если будет true, то просто сигналы не высылаются..а следовательно не выполняется условие, при котором они должны высылаться..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Sahab
Гость
« Ответ #6 : Январь 26, 2010, 10:53 »

($QTDIR)\examples\network\downloadmanager\
Записан
kadr
Гость
« Ответ #7 : Январь 26, 2010, 10:55 »

Код:
qDebug()<<connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished()));
qDebug()<<connect(reply, SIGNAL(readyRead()), this, SLOT(readyReadReply()));
А ты так проверь есть соединение или нет..если будет true, то просто сигналы не высылаются..а следовательно не выполняется условие, при котором они должны высылаться..
Да вышло true!
Записан
kadr
Гость
« Ответ #8 : Январь 26, 2010, 11:05 »

($QTDIR)\examples\network\downloadmanager\
В целом тоже самое что и у меня!
Записан
kadr
Гость
« Ответ #9 : Январь 26, 2010, 11:10 »

Дело в том, что там описано как скачать что, от куда-то, а мне надо передать файл!
Записан
Sahab
Гость
« Ответ #10 : Январь 26, 2010, 11:21 »

а где в Вашем коде идет передача содержимого файла?
Записан
Sahab
Гость
« Ответ #11 : Январь 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
Записан
kadr
Гость
« Ответ #12 : Январь 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();
Записан
voronElf
Гость
« Ответ #13 : Январь 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 при такой отправке через прокси запрос не проходил до сервака, а без прокси нормально ходил.
Записан
Sahab
Гость
« Ответ #14 : Январь 26, 2010, 11:52 »

а это к чему было?
...
requestString = "method=getQuote&format=csv";
...

и м.б.
QNetworkAccessManager *manager = new QNetworkAccessManager(this); ?
« Последнее редактирование: Январь 26, 2010, 11:54 от Sahab » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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