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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Заливка картинки на ImageHack.us средствами qnetworkaccessmanager  (Прочитано 14173 раз)
abodnya
Гость
« : Май 14, 2013, 00:46 »

Собственно по сабжу, цель - залить файл, который лежит на ПК на сервер imagehack.us
они предоставляют API:
Код:
Endpoint : https://post.imageshack.us/upload_api.php
Parameters :
* key : The api key for your application; found in email sent after filling out our API Key Request form
* fileupload : image file
* format : json
tags : a CSV list of tags to describe your picture
public : A string setting your image to public or private where "yes" is public and "no" is private. Images are public by default.
Нагуглил вот такой простенький пример:
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QByteArray>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QUrl>
#include <QUrlQuery>
#include <QtXml/QDomDocument>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    
private slots:
    // 3 //
    void serverRequest(QByteArray param);
    // 9 //
    void slotReply(QNetworkReply *reply);
    // 11 //
    void serverReplyParse(QString reply);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

Код:
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 1 //
    QUrl params;
    QUrlQuery q;
    q.addQueryItem("key", "СКРЫЛ В ЦЕЛЯХ БЕЗОПАСНОСТИ");
    //URL//
    q.addQueryItem("url", "http://animalbox.ru/wp-content/uploads/2012/04/imperatorskii_pingvin.jpg");
    params.setQuery(q);

    // 2 //
    QByteArray data;

    data.append(params.toString());
    data.remove(0, 1);

    // 4 //
    serverRequest(data);

}
// 3 //
void Widget::serverRequest(QByteArray param)
{

    // 5 //
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QNetworkRequest request;

    // 6 //
    connect(manager, SIGNAL(finished(QNetworkReply*)), this,
        SLOT(slotReply(QNetworkReply*)));

    // 7 //
    request.setUrl(QUrl("https://post.imageshack.us/upload_api.php"));
    request.setHeader(QNetworkRequest::ContentTypeHeader,
        "application/x-www-form-urlencoded");
    request.setRawHeader("User-Agent", "XMLParser 0.1");

    // 8 //
    manager->post(request, param);
}

// 9 //
void Widget::slotReply(QNetworkReply *reply)
{
    // 10 //
    QString replyString;
    replyString = reply->readAll();

    serverReplyParse(replyString);
}

// 11 //
void Widget::serverReplyParse(QString reply)
{
    QDomDocument xmlDoc;
    xmlDoc.setContent(reply);

    ui->textBrowser->setText(xmlDoc.toString());

    int userId = 0;

    if (xmlDoc.elementsByTagName("image_link").count() > 0)
        userId = xmlDoc.elementsByTagName("userId").at(0).toElement().text().toInt();
}

Widget::~Widget()
{
    delete ui;
}
На формочке один виджет - textBrowser - для вывода полученой от сервера информации

Алгоритм заливает уже выложенную в инете картинку на сервер imagehack.us
используя параметры
key - персональный ключ от imagehack
url - ссылка на картинку
Код:
    q.addQueryItem("key", "СКРЫЛ В ЦЕЛЯХ БЕЗОПАСНОСТИ");
    //URL//
    q.addQueryItem("url", "http://animalbox.ru/wp-content/uploads/2012/04/imperatorskii_pingvin.jpg");
Следуя API, вместо url я должен использовать параметр fileupload, который содержит адрес с картинке.
Но такой код не работает:
Код:
q.addQueryItem("fileupload", "/home/abodnya/walp1.png");
Сервер выдает ошибку:
Код:
<links>
 <error id="no_file_uploaded">No file was uploaded or empty file was uploaded</error>
</links>
Я так понял, что так делать нельзя.
Поэтому спрашиваю у вас как это делать правильно.
Это мой первый опыт работы с сетью, поэтому вместо того чтобы посылать "в гугл", "учить матчасть" и т.п. помогите советом и работающиим примером.

Upd 16/05/2013.
Проблема решена. Большое спасибо thechicho !!!
Рабочий проект в "прикрепленных"
« Последнее редактирование: Май 16, 2013, 19:12 от abodnya » Записан
vintik
Гость
« Ответ #1 : Май 14, 2013, 13:26 »

не очень разбираюсь в этом вопросе, но могу посоветовать глянуть проект https://code.google.com/p/datacod-qt-tools/
Как мне показалось, там реализована схожая функциональность. Возможно натолкнёт на решение проблемы
Записан
thechicho
Гость
« Ответ #2 : Май 14, 2013, 14:08 »

скинь в личку ключ, напишу пример
Записан
thechicho
Гость
« Ответ #3 : Май 15, 2013, 18:57 »

STOP = false;
SHOWHEADERS = true;

QByteArray keyValue = "";
QByteArray formatValue = "json";
//QByteArray tagsValue = "blabla";
//QByteArray publicValue = "yes";  

QFile file("test.png");
if (!file.open(QIODevice::ReadOnly)) {
    qDebug() << endl << "can't open file " << file.fileName() << " because: " << file.errorString();
    return;
}
QByteArray imageData = file.readAll();        

QByteArray boundary = QString::number(mRand(1111111, 9999999)).toUtf8() + QString::number(mRand(1111111, 9999999)).toUtf8();
postData = "-----------------------------" + boundary;
postData.append("\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\n" + keyValue);
postData.append("\r\n-----------------------------" + boundary);

QByteArray contentType = "application/octet-stream";
QString fileName = file.fileName();
if (fileName.endsWith(".jpg", Qt::CaseInsensitive) || fileName.endsWith(".jpeg", Qt::CaseInsensitive)) contentType = "image/jpeg";
else if (fileName.endsWith(".png", Qt::CaseInsensitive)) contentType = "image/png";
else if (fileName.endsWith(".gif", Qt::CaseInsensitive)) contentType = "image/gif";

postData.append("\r\nContent-Disposition: form-data; name=\"fileupload\"; filename=\"" + fileName.toUtf8() + "\"\r\nContent-Type: " + contentType + "\r\n\r\n");
postData.append(imageData);
postData.append("\r\n-----------------------------" + boundary);
postData.append("\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\n" + formatValue);
//postData.append("\r\n-----------------------------" + boundary);
//postData.append("\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n" + tagsValue);
//postData.append("\r\n-----------------------------" + boundary);
//postData.append("\r\nContent-Disposition: form-data; name=\"public\"\r\n\r\n" + publicValue);
postData.append("\r\n-----------------------------" + boundary + "--\r\n");

//postData = "key=" + keyValue + "&url=http://imageshack.us/a/img243/783/img2601mediumdj2.jpg&format=json";
qDebug() << endl << "postData" << postData;

request.setRawHeader("Content-Type", "multipart/form-data; boundary=---------------------------" + boundary);
request.setRawHeader("Accept-Encoding", "gzip, deflate");
request.setRawHeader("Connection", "close");
request.setUrl(QUrl("https://post.imageshack.us/upload_api.php"));

if (STOP) return;
POST(qnam, readAnswerToString, showHeaders, autoRedirect, request.rawHeader("Content-Type"));
if (STOP) return;
writeOnFile("test/1.html", answer);

QHash<QString, QString> jsonElements;
parseJson(jsonElements, answer);

qDebug() << endl << "status" << jsonElements.value("status");
qDebug() << "version" << jsonElements.value("version");
qDebug() << "timestamp" << jsonElements.value("timestamp");
qDebug() << "base_url" << jsonElements.value("base_url");
qDebug() << "id" << jsonElements.value("id");

qDebug() << endl << "rating.ratings" << jsonElements.value("rating.ratings");
qDebug() << "rating.avg" << jsonElements.value("rating.avg");

qDebug() << endl << "files.server" << jsonElements.value("files.server");
qDebug() << "files.bucket" << jsonElements.value("files.bucket");

qDebug() << endl << "files.image.size" << jsonElements.value("files.image.size");
qDebug() << "files.image.content-type" << jsonElements.value("files.image.content-type");
qDebug() << "files.image.filename" << jsonElements.value("files.image.filename");
qDebug() << "files.image.original_filename" << jsonElements.value("files.image.original_filename");

qDebug() << endl << "files.thumb.size" << jsonElements.value("files.thumb.size");
qDebug() << "files.thumb.content" << jsonElements.value("files.thumb.content");
qDebug() << "files.thumb.filename" << jsonElements.value("files.thumb.filename");

qDebug() << endl << "resolution.width" << jsonElements.value("resolution.width");
qDebug() << "resolution.height" << jsonElements.value("resolution.height");

qDebug() << endl << "class" << jsonElements.value("class");
qDebug() << "visibility" << jsonElements.value("visibility");

qDebug() << endl << "uploader.ip" << jsonElements.value("uploader.ip");
qDebug() << "uploader.cookie" << jsonElements.value("uploader.cookie");


QString imageLink = jsonElements.value("links.image_link");
qDebug() << endl << "links.image_link" << imageLink;
qDebug() << "links.image_html" << jsonElements.value("links.image_html");
qDebug() << "links.image_bb" << jsonElements.value("links.image_bb");
qDebug() << "links.image_bb2" << jsonElements.value("links.image_bb2");
qDebug() << "links.thumb_link" << jsonElements.value("links.thumb_link");
qDebug() << "links.thumb_bb" << jsonElements.value("links.thumb_bb");
qDebug() << "links.thumb_bb2" << jsonElements.value("links.thumb_bb2");
qDebug() << "links.is_link" << jsonElements.value("links.is_link");
qDebug() << "links.done" << jsonElements.value("links.done");
« Последнее редактирование: Май 15, 2013, 19:00 от thechicho » Записан
thechicho
Гость
« Ответ #4 : Май 15, 2013, 18:58 »

.pro
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib

.h
private:
    enum answerType {
        readAnswerToString,
        readAnswerToByteArray,
        readAnswerToOther,
        noReadAnswer
    };
    enum headersShowType {
        showHeaders,
        noShowHeaders
    };
    enum redirectType {
        autoRedirect,
        noMakeRedirect
    };
    void GET(QNetworkAccessManager &qnam, int howReadAnswer = readAnswerToString, int headers = showHeaders, int redirect = autoRedirect, QByteArray contentType = QByteArray(), bool repeat = true);
    void POST(QNetworkAccessManager &qnam, int howReadAnswer = readAnswerToString, int headers = showHeaders, int redirect = autoRedirect, QByteArray contentType = "application/x-www-form-urlencoded", bool repeat = true);
    void REDIRECT(QNetworkAccessManager &qnam, int howReadAnswer = readAnswerToString, int headers = showHeaders);
    void HTTPHEADERS(QNetworkReply *reply);

    QByteArray uncompress(const QByteArray &data);
    quint64 mRand(qint64, qint64, bool makeUSleep = false);
    void writeOnFile(const QString &fileName, const QString &data) const;
   void parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend = QString());
   
    QNetworkReply *reply;
    QNetworkRequest request;
    QString answer;
    QByteArray answerBytes;
    QString lastUrl;
    QString location;
    QString locationRedirect;
    int redirectCount;
    QHash<QByteArray, QByteArray> requestHeaders;
    QHash<QByteArray, QByteArray> replyHeaders;
    QByteArray postData;

    bool SHOWHEADERS;    
    bool STOP;
   
   QString parent;

.cpp
#include "zlib.h"

void Class::GET(QNetworkAccessManager &qnam, int howReadAnswer, int headers, int redirect, QByteArray contentType, bool repeat)
{
    QEventLoop loopGet;
    int badProxyCount=0;

    request.setRawHeader("Content-Type", contentType);

    REPEATGET:

    reply = qnam.get(request);
    reply->ignoreSslErrors();
    //if (proxyType == "NoUseProxy")

    QTimer::singleShot(60000, &loopGet, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &loopGet, SLOT(quit()));
    loopGet.exec();

    if (reply->error()) {
        qDebug() << "REPLY ERROR:" << reply->errorString() << reply->error();

        if (repeat && badProxyCount<3) {
            badProxyCount++;
            qDebug() << "badProxyCountGet: " << badProxyCount;
            delete reply;
            goto REPEATGET;
        }
    }

///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ НАЧАЛО ////////////////////////
    requestHeaders.clear();
    QList<QByteArray> listHeaders = reply->request().rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->request().rawHeader(nameHeader);
        requestHeaders.insert(nameHeader, valueHeader);
    }
    replyHeaders.clear();
    listHeaders = reply->rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->rawHeader(nameHeader);
        replyHeaders.insert(nameHeader, valueHeader);
    }
///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ КОНЕЦ ////////////////////////

    if (headers == showHeaders) HTTPHEADERS(reply);

    location = QByteArray::fromPercentEncoding(reply->rawHeader("Location"));
    if (!reply->rawHeader("Ajax-Location").isEmpty()) {
        location = QByteArray::fromPercentEncoding(reply->rawHeader("Ajax-Location"));
    }
    if (redirect == autoRedirect) {
        if (!location.isEmpty()) {
            lastUrl = reply->url().toString();

            redirectCount = 0;
            REDIRECT(qnam, howReadAnswer, showHeaders);
            return;
        }
    }

    answer.clear();
    answerBytes.clear();

    if (howReadAnswer == readAnswerToString) {
        if (reply->rawHeader("Content-Encoding").contains("gzip")) {
            answer = uncompress(reply->readAll());
        } else {
            answer = reply->readAll();
        }
    } else if (howReadAnswer == readAnswerToByteArray) {
        answerBytes = reply->readAll();
    } else if (howReadAnswer == readAnswerToOther) {
        if (reply->rawHeader("Content-Type").contains("image/gif")) {
            if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
                answerBytes = uncompress(reply->readAll());
            } else {
                answerBytes = reply->readAll();
            }
        } else {
            if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
                answer = uncompress(reply->readAll());
            } else {
                answer = reply->readAll();
            }
        }
    }

    lastUrl = reply->url().toString();

    delete reply;
}

void Class::POST(QNetworkAccessManager &qnam, int howReadAnswer, int headers, int redirect, QByteArray contentType, bool repeat)
{
    QEventLoop loopPost;
    int badProxyCount=0;

    REPEATPOST:

    request.setRawHeader("Content-Type", contentType);

    reply = qnam.post(request, postData);
    reply->ignoreSslErrors();

    QTimer::singleShot(60000, &loopPost, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &loopPost, SLOT(quit()));
    loopPost.exec();

    if (reply->error()) {
        qDebug() << "REPLY ERROR:" << reply->errorString() << reply->error();

        if (repeat && badProxyCount<3) {
            badProxyCount++;
            qDebug() << "badProxyCountPost: " << badProxyCount;
            delete reply;
            goto REPEATPOST;
        }
    }

///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ НАЧАЛО ////////////////////////
    requestHeaders.clear();
    QList<QByteArray> listHeaders = reply->request().rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->request().rawHeader(nameHeader);
        requestHeaders.insert(nameHeader, valueHeader);
    }
    replyHeaders.clear();
    listHeaders = reply->rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->rawHeader(nameHeader);
        replyHeaders.insert(nameHeader, valueHeader);
    }
///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ КОНЕЦ ////////////////////////

    if (headers == showHeaders) HTTPHEADERS(reply);

    location = QByteArray::fromPercentEncoding(reply->rawHeader("Location"));
    if (!reply->rawHeader("Ajax-Location").isEmpty()) {
        location = QByteArray::fromPercentEncoding(reply->rawHeader("Ajax-Location"));
    }
    if (redirect == autoRedirect) {
        if (!location.isEmpty()) {
            lastUrl = reply->url().toString();

            redirectCount = 0;
            REDIRECT(qnam, howReadAnswer, showHeaders);
            return;
        }
    }

    if (howReadAnswer == readAnswerToString) {
        if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
            answer = uncompress(reply->readAll());
        } else {
            answer = reply->readAll();
        }
    } else if (howReadAnswer == readAnswerToByteArray) {
        answerBytes = reply->readAll();
    }

    lastUrl = reply->url().toString();

    delete reply;
}

void Class::REDIRECT(QNetworkAccessManager &qnam, int howReadAnswer, int headers)
{
    QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();

    qDebug() << "redirect url do: " << redirectUrl;

    if (!redirectUrl.isEmpty() && redirectUrl.isRelative()) {
        redirectUrl = reply->url().resolved(redirectUrl);
        qDebug() << "redirect url posle: " << redirectUrl;
    } else if (!reply->rawHeader("Ajax-Location").isEmpty()) {
        request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        request.setRawHeader("Wicket-Ajax", QByteArray());
        redirectUrl = reply->url().resolved(QUrl::fromPercentEncoding(reply->rawHeader("Ajax-Location")));
        qDebug() << "redirect url Ajax-Location posle: " << redirectUrl;
    } else if (redirectUrl.isEmpty()) {
        qDebug() << endl << this->objectName() << endl << endl << "NO REDIRECT!!!" << endl << endl << endl;
        return;
    }

    request.setRawHeader("Content-Type", QByteArray());
    request.setUrl(redirectUrl);

    QEventLoop loopRedirect;
    int badProxyCount=0;

    delete reply;

    REPEATREDIRECT:

    reply = qnam.get(request);
    reply->ignoreSslErrors();

    QTimer::singleShot(60000, &loopRedirect, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &loopRedirect, SLOT(quit()));
    loopRedirect.exec();

    qDebug() << reply->url();
    if (reply->error()) {
        qDebug() << "REPLY ERROR:" << reply->errorString() << reply->error();

        if (badProxyCount<3) {
            badProxyCount++;
            qDebug() << "badProxyCountRedirect: " << badProxyCount;
            delete reply;
            goto REPEATREDIRECT;
        }
    }

///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ НАЧАЛО ////////////////////////
    requestHeaders.clear();
    QList<QByteArray> listHeaders = reply->request().rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->request().rawHeader(nameHeader);
        requestHeaders.insert(nameHeader, valueHeader);
    }
    replyHeaders.clear();
    listHeaders = reply->rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->rawHeader(nameHeader);
        replyHeaders.insert(nameHeader, valueHeader);
    }
///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ КОНЕЦ ////////////////////////

    if (headers == showHeaders) HTTPHEADERS(reply);

    if ((!reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl().isEmpty() || !reply->rawHeader("Ajax-Location").isEmpty())
            && redirectCount < 33) {
        redirectCount++;
        REDIRECT(qnam, howReadAnswer, showHeaders);
    } else {
        if (howReadAnswer == readAnswerToString) {
            if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
                answer = uncompress(reply->readAll());
            } else {
                answer = reply->readAll();
            }
        } else if (howReadAnswer == readAnswerToByteArray) {
            answerBytes = reply->readAll();
        }

        locationRedirect = QByteArray::fromPercentEncoding(reply->rawHeader("Location"));
        if (!reply->rawHeader("Ajax-Location").isEmpty()) {
            locationRedirect = QByteArray::fromPercentEncoding(reply->rawHeader("Ajax-Location"));
        }
        lastUrl = reply->url().toString();
        delete reply;
    }
}

void Class::HTTPHEADERS(QNetworkReply *reply)
{
    if (!SHOWHEADERS) return;

    qDebug() << endl << this->objectName() << reply->url();
    qDebug() << "Request headers:  ";
    QList<QByteArray> reqHeaders = reply->request().rawHeaderList();
    foreach (QByteArray reqName, reqHeaders)
    {
        QByteArray reqValue = reply->request().rawHeader(reqName);
        qDebug() << reqName << ":" << reqValue;
    }
    qDebug() << "Reply headers:  ";
    QList<QByteArray> reqHeadersReply = reply->rawHeaderList();
    foreach( QByteArray reqName, reqHeadersReply )
    {
        QByteArray reqValue = reply->rawHeader( reqName );
        qDebug() << reqName << ":" << reqValue;
    }
}

QByteArray Class::uncompress(const QByteArray &data)
{
    if (data.size() <= 4) {
        qDebug("uncompress: Input data is truncated");
        return QByteArray();
    }

    QByteArray result;

    int ret;
    z_stream strm;
    static const int CHUNK_SIZE = 1024;
    char out[CHUNK_SIZE];

    /* allocate inflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = data.size();
    strm.next_in = (Bytef*)(data.data());

    ret = inflateInit2(&strm, 15 +  32); // gzip decoding
    if (ret != Z_OK)
        return QByteArray();

    // run inflate()
    do {
        strm.avail_out = CHUNK_SIZE;
        strm.next_out = (Bytef*)(out);

        ret = inflate(&strm, Z_NO_FLUSH);
        Q_ASSERT(ret != Z_STREAM_ERROR);  // state not clobbered

        switch (ret) {
        case Z_NEED_DICT:
            ret = Z_DATA_ERROR;     // and fall through
        case Z_DATA_ERROR:
        case Z_MEM_ERROR:
            (void)inflateEnd(&strm);
            return QByteArray();
        }

        result.append(out, CHUNK_SIZE - strm.avail_out);
    } while (strm.avail_out == 0);

    // clean up and return
    inflateEnd(&strm);
    return result;
}

quint64 Class::mRand(qint64 a, qint64 b, bool makeUSleep)
{
    if (makeUSleep) usleep(1);
    qsrand(QDateTime::currentMSecsSinceEpoch() + reinterpret_cast<quint64>(this));
    return (qrand() + qrand() * RAND_MAX)%(b-a+1)+a;
}

void Class::writeOnFile(const QString &fileName, const QString &data) const
{
    QFile file(fileName);
    file.open(QIODevice::WriteOnly);
    QTextStream out(&file);
    out << data;
    file.close();
}

void Class::parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend)
{
    QRegExp rx; rx.setMinimal(true); rx.setCaseSensitivity(Qt::CaseInsensitive);
    rx.setPattern("\"([^\"]+)\"Грустный?Грустный[^\\{][^,]*)(?:,|\\})|(\\{[^\\{]*\\})|(\\{.+\\}[^,]+))");
    int pos = 0;
    while ((pos = rx.indexIn(strIndexIn, pos)) != -1) {
        //qDebug() << "rx.cap(1)" << rx.cap(1) << "rx.cap(2)" << rx.cap(2) << "rx.cap(3)" << rx.cap(3) << "rx.cap(4)" << rx.cap(4);
        if (!rx.cap(2).isEmpty()) {
            jsonElements.insert(prepend + rx.cap(1), rx.cap(2).replace(QRegExp("(?:\"|\\})"), ""));
        } else if (!rx.cap(3).isEmpty()) {
            parseJson(jsonElements, rx.cap(3), parent + rx.cap(1) + ".");
        } else if (!rx.cap(4).isEmpty()) {
            parent = rx.cap(1) + ".";
            parseJson(jsonElements, rx.cap(4), parent);
            parent.clear();
        }
        pos += rx.matchedLength();
    }
//    qDebug() << endl << "jsonElements" << "keys" << jsonElements.keys().count() << "values" << jsonElements.values().count();
//    QHash<QString, QString>::const_iterator iteratorJsonElements = jsonElements.constBegin();
//    while (iteratorJsonElements != jsonElements.constEnd()) {
//        qDebug() << iteratorJsonElements.key() << "=" << iteratorJsonElements.value();
//        ++iteratorJsonElements;
//    }
}
« Последнее редактирование: Май 15, 2013, 18:59 от thechicho » Записан
abodnya
Гость
« Ответ #5 : Май 16, 2013, 00:41 »

Составил такой проект:
pro
Код:
#-------------------------------------------------
#
# Project created by QtCreator 2013-05-15T21:49:31
#
#-------------------------------------------------


#INCLUDEPATH += /opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = testNetworkQt-2
CONFIG   += console

TEMPLATE = app

SOURCES += main.cpp \
    class.cpp

HEADERS += \
    class.h
h
Код:
#ifndef CLASS_H
#define CLASS_H

#include <QWidget>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QEventLoop>
#include <QtNetwork/QNetworkReply>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <QDateTime>
#include <QHash>

class Class : public QWidget
{
    Q_OBJECT
public:
    explicit Class(QWidget *parent = 0);
   
signals:
   
public slots:

private:
    enum answerType {
        readAnswerToString,
        readAnswerToByteArray,
        readAnswerToOther,
        noReadAnswer
    };
    enum headersShowType {
        showHeaders,
        noShowHeaders
    };
    enum redirectType {
        autoRedirect,
        noMakeRedirect
    };
    void GET(QNetworkAccessManager &qnam, int howReadAnswer = readAnswerToString, int headers = showHeaders, int redirect = autoRedirect, QByteArray contentType = QByteArray(), bool repeat = true);
    void POST(QNetworkAccessManager &qnam, int howReadAnswer = readAnswerToString, int headers = showHeaders, int redirect = autoRedirect, QByteArray contentType = "application/x-www-form-urlencoded", bool repeat = true);
    void REDIRECT(QNetworkAccessManager &qnam, int howReadAnswer = readAnswerToString, int headers = showHeaders);
    void HTTPHEADERS(QNetworkReply *reply);

    QByteArray uncompress(const QByteArray &data);
    quint64 mRand(qint64, qint64, bool makeUSleep = false);
    void writeOnFile(const QString &fileName, const QString &data) const;
   void parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend = QString());

    QNetworkReply *reply;
    QNetworkRequest request;
    QString answer;
    QByteArray answerBytes;
    QString lastUrl;
    QString location;
    QString locationRedirect;
    int redirectCount;
    QHash<QByteArray, QByteArray> requestHeaders;
    QHash<QByteArray, QByteArray> replyHeaders;
    QByteArray postData;

    bool SHOWHEADERS;
    bool STOP;

   QString parent;
   
};

#endif // CLASS_H
cpp
Код:

#include "class.h"


Class::Class(QWidget *parent) :
    QWidget(parent)
{
}

//#include "/opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib/zlib.h"
#include "zlib.h"

void Class::GET(QNetworkAccessManager &qnam, int howReadAnswer, int headers, int redirect, QByteArray contentType, bool repeat)
{
    QEventLoop loopGet;
    int badProxyCount=0;

    request.setRawHeader("Content-Type", contentType);

    REPEATGET:

    reply = qnam.get(request);
    reply->ignoreSslErrors();
    //if (proxyType == "NoUseProxy")

    QTimer::singleShot(60000, &loopGet, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &loopGet, SLOT(quit()));
    loopGet.exec();

    if (reply->error()) {
        qDebug() << "REPLY ERROR:" << reply->errorString() << reply->error();

        if (repeat && badProxyCount<3) {
            badProxyCount++;
            qDebug() << "badProxyCountGet: " << badProxyCount;
            delete reply;
            goto REPEATGET;
        }
    }

///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ НАЧАЛО ////////////////////////
    requestHeaders.clear();
    QList<QByteArray> listHeaders = reply->request().rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->request().rawHeader(nameHeader);
        requestHeaders.insert(nameHeader, valueHeader);
    }
    replyHeaders.clear();
    listHeaders = reply->rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->rawHeader(nameHeader);
        replyHeaders.insert(nameHeader, valueHeader);
    }
///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ КОНЕЦ ////////////////////////

    if (headers == showHeaders) HTTPHEADERS(reply);

    location = QByteArray::fromPercentEncoding(reply->rawHeader("Location"));
    if (!reply->rawHeader("Ajax-Location").isEmpty()) {
        location = QByteArray::fromPercentEncoding(reply->rawHeader("Ajax-Location"));
    }
    if (redirect == autoRedirect) {
        if (!location.isEmpty()) {
            lastUrl = reply->url().toString();

            redirectCount = 0;
            REDIRECT(qnam, howReadAnswer, showHeaders);
            return;
        }
    }

    answer.clear();
    answerBytes.clear();

    if (howReadAnswer == readAnswerToString) {
        if (reply->rawHeader("Content-Encoding").contains("gzip")) {
            answer = uncompress(reply->readAll());
        } else {
            answer = reply->readAll();
        }
    } else if (howReadAnswer == readAnswerToByteArray) {
        answerBytes = reply->readAll();
    } else if (howReadAnswer == readAnswerToOther) {
        if (reply->rawHeader("Content-Type").contains("image/gif")) {
            if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
                answerBytes = uncompress(reply->readAll());
            } else {
                answerBytes = reply->readAll();
            }
        } else {
            if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
                answer = uncompress(reply->readAll());
            } else {
                answer = reply->readAll();
            }
        }
    }

    lastUrl = reply->url().toString();

    delete reply;
}

void Class::POST(QNetworkAccessManager &qnam, int howReadAnswer, int headers, int redirect, QByteArray contentType, bool repeat)
{
    QEventLoop loopPost;
    int badProxyCount=0;

    REPEATPOST:

    request.setRawHeader("Content-Type", contentType);

    reply = qnam.post(request, postData);
    reply->ignoreSslErrors();

    QTimer::singleShot(60000, &loopPost, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &loopPost, SLOT(quit()));
    loopPost.exec();

    if (reply->error()) {
        qDebug() << "REPLY ERROR:" << reply->errorString() << reply->error();

        if (repeat && badProxyCount<3) {
            badProxyCount++;
            qDebug() << "badProxyCountPost: " << badProxyCount;
            delete reply;
            goto REPEATPOST;
        }
    }

///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ НАЧАЛО ////////////////////////
    requestHeaders.clear();
    QList<QByteArray> listHeaders = reply->request().rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->request().rawHeader(nameHeader);
        requestHeaders.insert(nameHeader, valueHeader);
    }
    replyHeaders.clear();
    listHeaders = reply->rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->rawHeader(nameHeader);
        replyHeaders.insert(nameHeader, valueHeader);
    }
///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ КОНЕЦ ////////////////////////

    if (headers == showHeaders) HTTPHEADERS(reply);

    location = QByteArray::fromPercentEncoding(reply->rawHeader("Location"));
    if (!reply->rawHeader("Ajax-Location").isEmpty()) {
        location = QByteArray::fromPercentEncoding(reply->rawHeader("Ajax-Location"));
    }
    if (redirect == autoRedirect) {
        if (!location.isEmpty()) {
            lastUrl = reply->url().toString();

            redirectCount = 0;
            REDIRECT(qnam, howReadAnswer, showHeaders);
            return;
        }
    }

    if (howReadAnswer == readAnswerToString) {
        if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
            answer = uncompress(reply->readAll());
        } else {
            answer = reply->readAll();
        }
    } else if (howReadAnswer == readAnswerToByteArray) {
        answerBytes = reply->readAll();
    }

    lastUrl = reply->url().toString();

    delete reply;
}

void Class::REDIRECT(QNetworkAccessManager &qnam, int howReadAnswer, int headers)
{
    QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();

    qDebug() << "redirect url do: " << redirectUrl;

    if (!redirectUrl.isEmpty() && redirectUrl.isRelative()) {
        redirectUrl = reply->url().resolved(redirectUrl);
        qDebug() << "redirect url posle: " << redirectUrl;
    } else if (!reply->rawHeader("Ajax-Location").isEmpty()) {
        request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        request.setRawHeader("Wicket-Ajax", QByteArray());
        redirectUrl = reply->url().resolved(QUrl::fromPercentEncoding(reply->rawHeader("Ajax-Location")));
        qDebug() << "redirect url Ajax-Location posle: " << redirectUrl;
    } else if (redirectUrl.isEmpty()) {
        qDebug() << endl << this->objectName() << endl << endl << "NO REDIRECT!!!" << endl << endl << endl;
        return;
    }

    request.setRawHeader("Content-Type", QByteArray());
    request.setUrl(redirectUrl);

    QEventLoop loopRedirect;
    int badProxyCount=0;

    delete reply;

    REPEATREDIRECT:

    reply = qnam.get(request);
    reply->ignoreSslErrors();

    QTimer::singleShot(60000, &loopRedirect, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &loopRedirect, SLOT(quit()));
    loopRedirect.exec();

    qDebug() << reply->url();
    if (reply->error()) {
        qDebug() << "REPLY ERROR:" << reply->errorString() << reply->error();

        if (badProxyCount<3) {
            badProxyCount++;
            qDebug() << "badProxyCountRedirect: " << badProxyCount;
            delete reply;
            goto REPEATREDIRECT;
        }
    }

///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ НАЧАЛО ////////////////////////
    requestHeaders.clear();
    QList<QByteArray> listHeaders = reply->request().rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->request().rawHeader(nameHeader);
        requestHeaders.insert(nameHeader, valueHeader);
    }
    replyHeaders.clear();
    listHeaders = reply->rawHeaderList();
    foreach(QByteArray nameHeader, listHeaders) {
        QByteArray valueHeader = reply->rawHeader(nameHeader);
        replyHeaders.insert(nameHeader, valueHeader);
    }
///////////////////////////////// ЗАПИСЬ ЗАГОЛОВКОВ КОНЕЦ ////////////////////////

    if (headers == showHeaders) HTTPHEADERS(reply);

    if ((!reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl().isEmpty() || !reply->rawHeader("Ajax-Location").isEmpty())
            && redirectCount < 33) {
        redirectCount++;
        REDIRECT(qnam, howReadAnswer, showHeaders);
    } else {
        if (howReadAnswer == readAnswerToString) {
            if (reply->rawHeader("Content-Encoding").contains("gzip")) { //if (gzip)
                answer = uncompress(reply->readAll());
            } else {
                answer = reply->readAll();
            }
        } else if (howReadAnswer == readAnswerToByteArray) {
            answerBytes = reply->readAll();
        }

        locationRedirect = QByteArray::fromPercentEncoding(reply->rawHeader("Location"));
        if (!reply->rawHeader("Ajax-Location").isEmpty()) {
            locationRedirect = QByteArray::fromPercentEncoding(reply->rawHeader("Ajax-Location"));
        }
        lastUrl = reply->url().toString();
        delete reply;
    }
}

void Class::HTTPHEADERS(QNetworkReply *reply)
{
    if (!SHOWHEADERS) return;

    qDebug() << endl << this->objectName() << reply->url();
    qDebug() << "Request headers:  ";
    QList<QByteArray> reqHeaders = reply->request().rawHeaderList();
    foreach (QByteArray reqName, reqHeaders)
    {
        QByteArray reqValue = reply->request().rawHeader(reqName);
        qDebug() << reqName << ":" << reqValue;
    }
    qDebug() << "Reply headers:  ";
    QList<QByteArray> reqHeadersReply = reply->rawHeaderList();
    foreach( QByteArray reqName, reqHeadersReply )
    {
        QByteArray reqValue = reply->rawHeader( reqName );
        qDebug() << reqName << ":" << reqValue;
    }
}

QByteArray Class::uncompress(const QByteArray &data)
{
    if (data.size() <= 4) {
        qDebug("uncompress: Input data is truncated");
        return QByteArray();
    }

    QByteArray result;

    int ret;
    z_stream strm;
    static const int CHUNK_SIZE = 1024;
    char out[CHUNK_SIZE];

    /* allocate inflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = data.size();
    strm.next_in = (Bytef*)(data.data());

    ret = inflateInit2(&strm, 15 +  32); // gzip decoding
    if (ret != Z_OK)
        return QByteArray();

    // run inflate()
    do {
        strm.avail_out = CHUNK_SIZE;
        strm.next_out = (Bytef*)(out);

        ret = inflate(&strm, Z_NO_FLUSH);
        Q_ASSERT(ret != Z_STREAM_ERROR);  // state not clobbered

        switch (ret) {
        case Z_NEED_DICT:
            ret = Z_DATA_ERROR;     // and fall through
        case Z_DATA_ERROR:
        case Z_MEM_ERROR:
            (void)inflateEnd(&strm);
            return QByteArray();
        }

        result.append(out, CHUNK_SIZE - strm.avail_out);
    } while (strm.avail_out == 0);

    // clean up and return
    inflateEnd(&strm);
    return result;
}

quint64 Class::mRand(qint64 a, qint64 b, bool makeUSleep)
{
    if (makeUSleep) usleep(1);
    qsrand(QDateTime::currentMSecsSinceEpoch() + reinterpret_cast<quint64>(this));
    return (qrand() + qrand() * RAND_MAX)%(b-a+1)+a;
}

void Class::writeOnFile(const QString &fileName, const QString &data) const
{
    QFile file(fileName);
    file.open(QIODevice::WriteOnly);
    QTextStream out(&file);
    out << data;
    file.close();
}
Записан
abodnya
Гость
« Ответ #6 : Май 16, 2013, 00:43 »

В одно сообщение не влезло)
cpp (продолжение)
Код:
void Class::parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend)
{
    QRegExp rx; rx.setMinimal(true); rx.setCaseSensitivity(Qt::CaseInsensitive);
    rx.setPattern("\"([^\"]+)\"?[^\\{][^,]*)(?:,|\\})|(\\{[^\\{]*\\})|(\\{.+\\}[^,]+))");
    int pos = 0;
    while ((pos = rx.indexIn(strIndexIn, pos)) != -1) {
        //qDebug() << "rx.cap(1)" << rx.cap(1) << "rx.cap(2)" << rx.cap(2) << "rx.cap(3)" << rx.cap(3) << "rx.cap(4)" << rx.cap(4);
        if (!rx.cap(2).isEmpty()) {
            jsonElements.insert(prepend + rx.cap(1), rx.cap(2).replace(QRegExp("(?:\"|\\})"), ""));
        } else if (!rx.cap(3).isEmpty()) {
            parseJson(jsonElements, rx.cap(3), parent + rx.cap(1) + ".");
        } else if (!rx.cap(4).isEmpty()) {
            parent = rx.cap(1) + ".";
            parseJson(jsonElements, rx.cap(4), parent);
            parent.clear();
        }
        pos += rx.matchedLength();
    }
//    qDebug() << endl << "jsonElements" << "keys" << jsonElements.keys().count() << "values" << jsonElements.values().count();
//    QHash<QString, QString>::const_iterator iteratorJsonElements = jsonElements.constBegin();
//    while (iteratorJsonElements != jsonElements.constEnd()) {
//        qDebug() << iteratorJsonElements.key() << "=" << iteratorJsonElements.value();
//        ++iteratorJsonElements;
//    }
    STOP = false;
    SHOWHEADERS = true;

    QByteArray keyValue = "ВСТАВИЛ СЮДА СВОЙ КЛЮЧ";
    QByteArray formatValue = "json";
    //QByteArray tagsValue = "blabla";
    //QByteArray publicValue = "yes";

    QFile file("test.png");
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << endl << "can't open file " << file.fileName() << " because: " << file.errorString();
        return;
    }
    QByteArray imageData = file.readAll();

    QByteArray boundary = QString::number(mRand(1111111, 9999999)).toUtf8() + QString::number(mRand(1111111, 9999999)).toUtf8();
    postData = "-----------------------------" + boundary;
    postData.append("\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\n" + keyValue);
    postData.append("\r\n-----------------------------" + boundary);

    QByteArray contentType = "application/octet-stream";
    QString fileName = file.fileName();
    if (fileName.endsWith(".jpg", Qt::CaseInsensitive) || fileName.endsWith(".jpeg", Qt::CaseInsensitive)) contentType = "image/jpeg";
    else if (fileName.endsWith(".png", Qt::CaseInsensitive)) contentType = "image/png";
    else if (fileName.endsWith(".gif", Qt::CaseInsensitive)) contentType = "image/gif";

    postData.append("\r\nContent-Disposition: form-data; name=\"fileupload\"; filename=\"" + fileName.toUtf8() + "\"\r\nContent-Type: " + contentType + "\r\n\r\n");
    postData.append(imageData);
    postData.append("\r\n-----------------------------" + boundary);
    postData.append("\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\n" + formatValue);
    //postData.append("\r\n-----------------------------" + boundary);
    //postData.append("\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n" + tagsValue);
    //postData.append("\r\n-----------------------------" + boundary);
    //postData.append("\r\nContent-Disposition: form-data; name=\"public\"\r\n\r\n" + publicValue);
    postData.append("\r\n-----------------------------" + boundary + "--\r\n");

    //postData = "key=" + keyValue + "&url=http://imageshack.us/a/img243/783/img2601mediumdj2.jpg&format=json";
    qDebug() << endl << "postData" << postData;

    request.setRawHeader("Content-Type", "multipart/form-data; boundary=---------------------------" + boundary);
    request.setRawHeader("Accept-Encoding", "gzip, deflate");
    request.setRawHeader("Connection", "close");
    request.setUrl(QUrl("https://post.imageshack.us/upload_api.php"));

    if (STOP) return;
    POST(qnam, readAnswerToString, showHeaders, autoRedirect, request.rawHeader("Content-Type"));
    if (STOP) return;
    writeOnFile("test/1.html", answer);

    QHash<QString, QString> jsonElements;
    parseJson(jsonElements, answer);

    qDebug() << endl << "status" << jsonElements.value("status");
    qDebug() << "version" << jsonElements.value("version");
    qDebug() << "timestamp" << jsonElements.value("timestamp");
    qDebug() << "base_url" << jsonElements.value("base_url");
    qDebug() << "id" << jsonElements.value("id");

    qDebug() << endl << "rating.ratings" << jsonElements.value("rating.ratings");
    qDebug() << "rating.avg" << jsonElements.value("rating.avg");

    qDebug() << endl << "files.server" << jsonElements.value("files.server");
    qDebug() << "files.bucket" << jsonElements.value("files.bucket");

    qDebug() << endl << "files.image.size" << jsonElements.value("files.image.size");
    qDebug() << "files.image.content-type" << jsonElements.value("files.image.content-type");
    qDebug() << "files.image.filename" << jsonElements.value("files.image.filename");
    qDebug() << "files.image.original_filename" << jsonElements.value("files.image.original_filename");

    qDebug() << endl << "files.thumb.size" << jsonElements.value("files.thumb.size");
    qDebug() << "files.thumb.content" << jsonElements.value("files.thumb.content");
    qDebug() << "files.thumb.filename" << jsonElements.value("files.thumb.filename");

    qDebug() << endl << "resolution.width" << jsonElements.value("resolution.width");
    qDebug() << "resolution.height" << jsonElements.value("resolution.height");

    qDebug() << endl << "class" << jsonElements.value("class");
    qDebug() << "visibility" << jsonElements.value("visibility");

    qDebug() << endl << "uploader.ip" << jsonElements.value("uploader.ip");
    qDebug() << "uploader.cookie" << jsonElements.value("uploader.cookie");


    QString imageLink = jsonElements.value("links.image_link");
    qDebug() << endl << "links.image_link" << imageLink;
    qDebug() << "links.image_html" << jsonElements.value("links.image_html");
    qDebug() << "links.image_bb" << jsonElements.value("links.image_bb");
    qDebug() << "links.image_bb2" << jsonElements.value("links.image_bb2");
    qDebug() << "links.thumb_link" << jsonElements.value("links.thumb_link");
    qDebug() << "links.thumb_bb" << jsonElements.value("links.thumb_bb");
    qDebug() << "links.thumb_bb2" << jsonElements.value("links.thumb_bb2");
    qDebug() << "links.is_link" << jsonElements.value("links.is_link");
    qDebug() << "links.done" << jsonElements.value("links.done");
}
получаю следующие ошибки:
Код:
/home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:-1: In member function 'void Class::parseJson(QHash<QString, QString>&, const QString&, const QString&)':
/home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:422: ошибка: 'qnam' was not declared in this scope
/home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:426: ошибка: declaration of 'QHash<QString, QString> jsonElements' shadows a parameter
Записан
thechicho
Гость
« Ответ #7 : Май 16, 2013, 13:15 »

ну все же написано.

void Class::parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend)
{
    QRegExp rx; rx.setMinimal(true); rx.setCaseSensitivity(Qt::CaseInsensitive);
    rx.setPattern("\"([^\"]+)\"?[^\\{][^,]*)(?:,|\\})|(\\{[^\\{]*\\})|(\\{.+\\}[^,]+))");
    int pos = 0;
    while ((pos = rx.indexIn(strIndexIn, pos)) != -1) {
        //qDebug() << "rx.cap(1)" << rx.cap(1) << "rx.cap(2)" << rx.cap(2) << "rx.cap(3)" << rx.cap(3) << "rx.cap(4)" << rx.cap(4);
        if (!rx.cap(2).isEmpty()) {
            jsonElements.insert(prepend + rx.cap(1), rx.cap(2).replace(QRegExp("(?:\"|\\})"), ""));
        } else if (!rx.cap(3).isEmpty()) {
            parseJson(jsonElements, rx.cap(3), parent + rx.cap(1) + ".");
        } else if (!rx.cap(4).isEmpty()) {
            parent.append(rx.cap(1) + ".");
            parseJson(jsonElements, rx.cap(4), parent);
            parent.clear();
        }
        pos += rx.matchedLength();
    }
//    qDebug() << endl << "jsonElements" << "keys" << jsonElements.keys().count() << "values" << jsonElements.values().count();
//    QHash<QString, QString>::const_iterator iteratorJsonElements = jsonElements.constBegin();
//    while (iteratorJsonElements != jsonElements.constEnd()) {
//        qDebug() << iteratorJsonElements.key() << "=" << iteratorJsonElements.value();
//        ++iteratorJsonElements;
//    }
}

отдельная функция. нафига ты в нее все запихал?
Записан
thechicho
Гость
« Ответ #8 : Май 16, 2013, 13:17 »

#include "class.h"
#include "zlib.h"

Class::Class(QWidget *parent) :
    QWidget(parent)
{
ui->setupUi(this);

STOP = false;
    SHOWHEADERS = true;

QNetworkAccessManager qnam;
        QNetworkCookieJar *cookieJar = new QNetworkCookieJar;
        qnam.setCookieJar(cookieJar);

QByteArray keyValue = "";
QByteArray formatValue = "json";
//QByteArray tagsValue = "blabla";
//QByteArray publicValue = "yes";   

QFile file("test.png");
if (!file.open(QIODevice::ReadOnly)) {
    qDebug() << endl << "can't open file " << file.fileName() << " because: " << file.errorString();
    return;
}
QByteArray imageData = file.readAll();       

QByteArray boundary = QString::number(mRand(1111111, 9999999)).toUtf8() + QString::number(mRand(1111111, 9999999)).toUtf8();
postData = "-----------------------------" + boundary;
postData.append("\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\n" + keyValue);
postData.append("\r\n-----------------------------" + boundary);

QByteArray contentType = "application/octet-stream";
QString fileName = file.fileName();
if (fileName.endsWith(".jpg", Qt::CaseInsensitive) || fileName.endsWith(".jpeg", Qt::CaseInsensitive)) contentType = "image/jpeg";
else if (fileName.endsWith(".png", Qt::CaseInsensitive)) contentType = "image/png";
else if (fileName.endsWith(".gif", Qt::CaseInsensitive)) contentType = "image/gif";

postData.append("\r\nContent-Disposition: form-data; name=\"fileupload\"; filename=\"" + fileName.toUtf8() + "\"\r\nContent-Type: " + contentType + "\r\n\r\n");
postData.append(imageData);
postData.append("\r\n-----------------------------" + boundary);
postData.append("\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\n" + formatValue);
//postData.append("\r\n-----------------------------" + boundary);
//postData.append("\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n" + tagsValue);
//postData.append("\r\n-----------------------------" + boundary);
//postData.append("\r\nContent-Disposition: form-data; name=\"public\"\r\n\r\n" + publicValue);
postData.append("\r\n-----------------------------" + boundary + "--\r\n");

//postData = "key=" + keyValue + "&url=http://imageshack.us/a/img243/783/img2601mediumdj2.jpg&format=json";
qDebug() << endl << "postData" << postData;

request.setRawHeader("Content-Type", "multipart/form-data; boundary=---------------------------" + boundary);
request.setRawHeader("Accept-Encoding", "gzip, deflate");
request.setRawHeader("Connection", "close");
request.setUrl(QUrl("https://post.imageshack.us/upload_api.php"));

if (STOP) return;
POST(qnam, readAnswerToString, showHeaders, autoRedirect, request.rawHeader("Content-Type"));
if (STOP) return;
writeOnFile("test/1.html", answer);

QHash<QString, QString> jsonElements;
parseJson(jsonElements, answer);

qDebug() << endl << "status" << jsonElements.value("status");
qDebug() << "version" << jsonElements.value("version");
qDebug() << "timestamp" << jsonElements.value("timestamp");
qDebug() << "base_url" << jsonElements.value("base_url");
qDebug() << "id" << jsonElements.value("id");

qDebug() << endl << "rating.ratings" << jsonElements.value("rating.ratings");
qDebug() << "rating.avg" << jsonElements.value("rating.avg");

qDebug() << endl << "files.server" << jsonElements.value("files.server");
qDebug() << "files.bucket" << jsonElements.value("files.bucket");

qDebug() << endl << "files.image.size" << jsonElements.value("files.image.size");
qDebug() << "files.image.content-type" << jsonElements.value("files.image.content-type");
qDebug() << "files.image.filename" << jsonElements.value("files.image.filename");
qDebug() << "files.image.original_filename" << jsonElements.value("files.image.original_filename");

qDebug() << endl << "files.thumb.size" << jsonElements.value("files.thumb.size");
qDebug() << "files.thumb.content" << jsonElements.value("files.thumb.content");
qDebug() << "files.thumb.filename" << jsonElements.value("files.thumb.filename");

qDebug() << endl << "resolution.width" << jsonElements.value("resolution.width");
qDebug() << "resolution.height" << jsonElements.value("resolution.height");

qDebug() << endl << "class" << jsonElements.value("class");
qDebug() << "visibility" << jsonElements.value("visibility");

qDebug() << endl << "uploader.ip" << jsonElements.value("uploader.ip");
qDebug() << "uploader.cookie" << jsonElements.value("uploader.cookie");


QString imageLink = jsonElements.value("links.image_link");
qDebug() << endl << "links.image_link" << imageLink;
qDebug() << "links.image_html" << jsonElements.value("links.image_html");
qDebug() << "links.image_bb" << jsonElements.value("links.image_bb");
qDebug() << "links.image_bb2" << jsonElements.value("links.image_bb2");
qDebug() << "links.thumb_link" << jsonElements.value("links.thumb_link");
qDebug() << "links.thumb_bb" << jsonElements.value("links.thumb_bb");
qDebug() << "links.thumb_bb2" << jsonElements.value("links.thumb_bb2");
qDebug() << "links.is_link" << jsonElements.value("links.is_link");
qDebug() << "links.done" << jsonElements.value("links.done");

}

у тебя все в конструкторе отработает.
вынеси в отдельный метод или слот (по клику на кнопке, например)

Записан
abodnya
Гость
« Ответ #9 : Май 16, 2013, 16:58 »

вынес тот код в конструктор
Также добавил в pro файле
QT       += core gui network

теперь получаю следующие ошибки:
/home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:404: ошибка: undefined reference to `inflateInit2_'
в строке:
ret = inflateInit2(&strm, 15 +  32); // gzip decoding

/home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:413: ошибка: undefined reference to `inflate'
в строке:
ret = inflate(&strm, Z_NO_FLUSH);

/home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:421: ошибка: undefined reference to `inflateEnd'
в строке:
case Z_MEM_ERROR:
            (void)inflateEnd(&strm);

/home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:429: ошибка: undefined reference to `inflateEnd'
в строке
inflateEnd(&strm);

Ошибка линковки:
:-1: ошибка: collect2: error: ld returned 1 exit status

Как подключить эту zlib ?
zlib.h включен в cpp-шник
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib прописано в pro
Записан
abodnya
Гость
« Ответ #10 : Май 16, 2013, 17:00 »

подключил следующие хедеры:

#include <QWidget>
#include <QtNetwork/QNetworkCookieJar>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QEventLoop>
#include <QtNetwork/QNetworkReply>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <QDateTime>
#include <QHash>
Записан
thechicho
Гость
« Ответ #11 : Май 16, 2013, 17:24 »

ну укажи путь до zlib епт Улыбающийся
INCLUDEPATH += /opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib

мой код для Qt 4.7.4

нафига тебе 5ая версия кьют? она больше для создания интерфейсов на qt quick (+андроиды всякие)
Записан
abodnya
Гость
« Ответ #12 : Май 16, 2013, 17:30 »

указывал, ошибку это не убирает.

ну вот для андроидов всяких наверное и ставил ) Хочу попозже с этим повозится + для Ubuntu Touch думаю потом ченить пописать.

Попробуй у себя прокомпилить на четверке. Может и правда дело в версии кьюта.
Хотя мне больше кажеться, что ошибка где-то незначительная.
Записан
thechicho
Гость
« Ответ #13 : Май 16, 2013, 18:02 »

у меня работает.
кстати, форум регулярку в функции сломал

Код:
void Gui::parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend)
{
    QRegExp rx; rx.setMinimal(true); rx.setCaseSensitivity(Qt::CaseInsensitive);
    rx.setPattern("\"([^\"]+)\":(?:([^\\{][^,]*)(?:,|\\})|(\\{[^\\{]*\\})|(\\{.+\\}[^,]+))");
    int pos = 0;
    while ((pos = rx.indexIn(strIndexIn, pos)) != -1) {
        //qDebug() << "rx.cap(1)" << rx.cap(1) << "rx.cap(2)" << rx.cap(2) << "rx.cap(3)" << rx.cap(3) << "rx.cap(4)" << rx.cap(4);
        if (!rx.cap(2).isEmpty()) {
            jsonElements.insert(prepend + rx.cap(1), rx.cap(2).replace(QRegExp("(?:\"|\\})"), ""));
        } else if (!rx.cap(3).isEmpty()) {
            parseJson(jsonElements, rx.cap(3), parent + rx.cap(1) + ".");
        } else if (!rx.cap(4).isEmpty()) {
            parent.append(rx.cap(1) + ".");
            parseJson(jsonElements, rx.cap(4), parent);
            parent.clear();
        }
        pos += rx.matchedLength();
    }
//    qDebug() << endl << "jsonElements" << "keys" << jsonElements.keys().count() << "values" << jsonElements.values().count();
//    QHash<QString, QString>::const_iterator iteratorJsonElements = jsonElements.constBegin();
//    while (iteratorJsonElements != jsonElements.constEnd()) {
//        qDebug() << iteratorJsonElements.key() << "=" << iteratorJsonElements.value();
//        ++iteratorJsonElements;
//    }
}

http://www.sendspace.com/file/8sckmz
Записан
thechicho
Гость
« Ответ #14 : Май 16, 2013, 18:09 »

-qt-zlib   Use the zlib bundled with Qt.   
-system-zlib   Use zlib from the operating system.   See http://www.gzip.org/zlib

у меня либа собрана с -qt-zlib
может у тебя системная. попробуй закомментить
#INCLUDEPATH += /opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib
#INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib

если не заработает, посмотри установлена у тебя в системе zlib вообще или нет. установи.

если опять не заработает найди, есть ли у тебя установленная zlib (/opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib)
проверь правильно ли ты указал путь.

на крайняк собери кьют с -qt-zlib
хотя я не знаю как там в 5ой версии. на 4.7.4 все работает
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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