Russian Qt Forum

Qt => Работа с сетью => Тема начата: abodnya от Май 14, 2013, 00:46



Название: [РЕШЕНО] Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: 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 !!!
Рабочий проект в "прикрепленных"


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: vintik от Май 14, 2013, 13:26
не очень разбираюсь в этом вопросе, но могу посоветовать глянуть проект https://code.google.com/p/datacod-qt-tools/
Как мне показалось, там реализована схожая функциональность. Возможно натолкнёт на решение проблемы


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 14, 2013, 14:08
скинь в личку ключ, напишу пример


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 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");


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 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;
//    }
}


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 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();
}


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 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


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 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;
//    }
}

отдельная функция. нафига ты в нее все запихал?


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 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");

}

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



Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 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


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 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>


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 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 (+андроиды всякие)


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 17:30
указывал, ошибку это не убирает.

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

Попробуй у себя прокомпилить на четверке. Может и правда дело в версии кьюта.
Хотя мне больше кажеться, что ошибка где-то незначительная.


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 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 (http://www.sendspace.com/file/8sckmz)


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 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 все работает


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 18:17
папка такая есть.

закоментил строки
#INCLUDEPATH += /opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib
#INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib

Ошибки линковщика те же.
в системе либы установленны
Код:
$ dpkg -l zlib*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  zlib-bin       1:1.2.7.dfsg i386         compression library - sample prog
ii  zlib-gst       3.2.4-2      i386         Zlib bindings for GNU Smalltalk
un  zlib1          <none>                    (no description available)
un  zlib1-dev      <none>                    (no description available)
ii  zlib1g:i386    1:1.2.7.dfsg i386         compression library - runtime
ii  zlib1g-dev:i38 1:1.2.7.dfsg i386         compression library - development
ii  zlibc          0.9k-4.1     i386         An on-fly auto-uncompressing C li

Пересобирать кьют как-то не хочется ) В ручную пару раз пробывал собрать (то версию для андроида, то статически под винду). Постоянно непонятные проблемы возникали, ниразу не вышло


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 16, 2013, 18:28
ну убери из кода uncompress

только тебе придется заголовки поменять
//request.setRawHeader("Accept-Encoding", "gzip, deflate");
request.setRawHeader("Accept-Encoding", "identity");


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 18:44
Прогресс есть, оно запустилось.
Выдало лог:
Код:
-----------------------------1844674407370797014318446744073707970143
Content-Disposition: form-data; name="fileupload"; filename="/home/abodnya/2013-05-14-181609_642x471_scrot.png"
Content-Type: image/png

�PNG


""  QUrl( "https://post.imageshack.us/upload_api.php" ) 
Request headers:   
"Accept-Encoding" : "identity"
"Connection" : "close"
"Content-Type" : "multipart/form-data; boundary=---------------------------1844674407370797014318446744073707970143"
"Content-Length" : "169045"
Reply headers:   
"Server" : "nginx/1.0.4"
"Date" : "Thu, 16 May 2013 15:43:16 GMT"
"Content-Type" : "application/json"
"Transfer-Encoding" : "chunked"
"Connection" : "close"
"X-Powered-By" : "PHP/5.2.9"

status ""
version ""
timestamp ""
base_url ""
id ""

rating.ratings ""
rating.avg ""

files.server ""
files.bucket ""

files.image.size ""
files.image.content-type ""
files.image.filename ""
files.image.original_filename ""

files.thumb.size ""
files.thumb.content ""
files.thumb.filename ""

resolution.width ""
resolution.height ""

class ""
visibility ""

uploader.ip ""
uploader.cookie ""

links.image_link ""
links.image_html ""
links.image_bb ""
links.image_bb2 ""
links.thumb_link ""
links.thumb_bb ""
links.thumb_bb2 ""
links.is_link ""
links.done ""
/home/abodnya/KPI/Projects/build-testNetworkQt-3-Desktop_Qt_5_0_2_GCC_32bit-Debug/testNetworkQt-3 завершился с кодом 0


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 18:48
Упс, не указал свой ключ. Уже указал.
Отчет такой:
Код:
Запускается /home/abodnya/KPI/Projects/build-testNetworkQt-3-Desktop_Qt_5_0_2_GCC_32bit-Debug/testNetworkQt-3...

postData "-----------------------------1844674407370743994818446744073707439948
Content-Disposition: form-data; name="key"

23459IQU68b63f0be4cfcf631cc6b40b5519c6cb
-----------------------------1844674407370743994818446744073707439948
Content-Disposition: form-data; name="fileupload"; filename="/home/abodnya/2013-05-14-181609_642x471_scrot.png"
Content-Type: image/png

�PNG


""  QUrl( "https://post.imageshack.us/upload_api.php" ) 
Request headers:   
"Accept-Encoding" : "identity"
"Connection" : "close"
"Content-Type" : "multipart/form-data; boundary=---------------------------1844674407370743994818446744073707439948"
"Content-Length" : "169085"
Reply headers:   
"Server" : "nginx/1.0.4"
"Date" : "Thu, 16 May 2013 15:47:19 GMT"
"Content-Type" : "application/json"
"Transfer-Encoding" : "chunked"
"Connection" : "close"
"X-Powered-By" : "PHP/5.2.9"
"Set-Cookie" : "latest=img827; expires=Sun, 11-May-2014 15:47:18 GMT; path=/; domain=.imageshack.us
new_imageshack=y; expires=Sat, 25-Mar-2023 15:47:18 GMT; path=/; domain=.imageshack.us
PHPSESSID=fd296bdc0ff96216a879380b9ed33d62; path=/
imgshck=fd296bdc0ff96216a879380b9ed33d62; expires=Sun, 11-May-2014 15:47:18 GMT; path=/; domain=.imageshack.us
un_cookie=1; expires=Fri, 17-May-2013 15:47:18 GMT; path=/; domain=.imageshack.us
conversion=deleted; expires=Wed, 16-May-2012 15:47:17 GMT; path=/; domain=.imageshack.us
always_opt=-1; path=/; domain=.imageshack.us
rem_bar=0; path=/; domain=.imageshack.us
myimages=3c5b0c938eb11cb635c0d4c861e79065; expires=Sun, 11-May-2014 15:47:19 GMT; path=/; domain=.imageshack.us
isUSER=deleted; expires=Wed, 16-May-2012 15:47:18 GMT; path=/; domain=.imageshack.us
myid=1032232567; expires=Sun, 11-May-2014 15:47:19 GMT; path=/; domain=.imageshack.us"

status ""
version ""
timestamp ""
base_url ""
id ""

rating.ratings ""
rating.avg ""

files.server ""
files.bucket ""

files.image.size ""
files.image.content-type ""
files.image.filename ""
files.image.original_filename ""

files.thumb.size ""
files.thumb.content ""
files.thumb.filename ""

resolution.width ""
resolution.height ""

class ""
visibility ""

uploader.ip ""
uploader.cookie ""

links.image_link ""
links.image_html ""
links.image_bb ""
links.image_bb2 ""
links.thumb_link ""
links.thumb_bb ""
links.thumb_bb2 ""
links.is_link ""
links.done ""
/home/abodnya/KPI/Projects/build-testNetworkQt-3-Desktop_Qt_5_0_2_GCC_32bit-Debug/testNetworkQt-3 завершился с кодом 0


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 16, 2013, 18:50
нубас)
регулярку поменяй в функции, я же написал, что форум изменил ее

Код:
void Gui::parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend)
{
    QRegExp rx; rx.setMinimal(true); rx.setCaseSensitivity(Qt::CaseInsensitive);
    rx.setPattern("\"([^\"]+)\":(?:([^\\{][^,]*)(?:,|\\})|(\\{[^\\{]*\\})|(\\{.+\\}[^,]+))");

так надо


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 18:52
ага) я обращал на это внимание, но как-то с головы вылетело )

Подтверждаю, всё работает =))

Код:
Запускается /home/abodnya/KPI/Projects/build-testNetworkQt-3-Desktop_Qt_5_0_2_GCC_32bit-Debug/testNetworkQt-3...

postData "-----------------------------22782882278288
Content-Disposition: form-data; name="key"

23459IQU68b63f0be4cfcf631cc6b40b5519c6cb
-----------------------------22782882278288
Content-Disposition: form-data; name="fileupload"; filename="/home/abodnya/2013-05-14-181609_642x471_scrot.png"
Content-Type: image/png

�PNG


""  QUrl( "https://post.imageshack.us/upload_api.php" ) 
Request headers:   
"Accept-Encoding" : "identity"
"Connection" : "close"
"Content-Type" : "multipart/form-data; boundary=---------------------------22782882278288"
"Content-Length" : "168981"
Reply headers:   
"Server" : "nginx/1.0.4"
"Date" : "Thu, 16 May 2013 15:51:20 GMT"
"Content-Type" : "application/json"
"Transfer-Encoding" : "chunked"
"Connection" : "close"
"X-Powered-By" : "PHP/5.2.9"
"Set-Cookie" : "latest=img822; expires=Sun, 11-May-2014 15:51:20 GMT; path=/; domain=.imageshack.us
new_imageshack=y; expires=Sat, 25-Mar-2023 15:51:20 GMT; path=/; domain=.imageshack.us
PHPSESSID=4074b6e80e338531bb45a3086850feea; path=/
imgshck=4074b6e80e338531bb45a3086850feea; expires=Sun, 11-May-2014 15:51:20 GMT; path=/; domain=.imageshack.us
un_cookie=1; expires=Fri, 17-May-2013 15:51:20 GMT; path=/; domain=.imageshack.us
conversion=deleted; expires=Wed, 16-May-2012 15:51:19 GMT; path=/; domain=.imageshack.us
always_opt=-1; path=/; domain=.imageshack.us
rem_bar=0; path=/; domain=.imageshack.us
myimages=3c5b0c938eb11cb635c0d4c861e79065; expires=Sun, 11-May-2014 15:51:20 GMT; path=/; domain=.imageshack.us
isUSER=deleted; expires=Wed, 16-May-2012 15:51:19 GMT; path=/; domain=.imageshack.us
myid=1032234063; expires=Sun, 11-May-2014 15:51:20 GMT; path=/; domain=.imageshack.us"

status "1"
version "8"
timestamp "1368719480"
base_url "imageshack.us/a/"
id "1032234063"

rating.ratings "0"
rating.avg "0"

files.server "822"
files.bucket "6703"

files.image.size "168514"
files.image.content-type "image/png"
files.image.filename "20130514181609642x471sc.png"
files.image.original_filename "2013-05-14-181609_642x471_scrot.png"

files.thumb.size "7454"
files.thumb.content "image/jpeg"
files.thumb.filename "20130514181609642x471sc.th.png"

resolution.width "642"
resolution.height "471"

class "r"
visibility "yes"

uploader.ip "127.0.0.1"
uploader.cookie "3c5b0c938eb11cb635c0d4c861e79065"

links.image_link "http://imageshack.us/a/img822/6703/20130514181609642x471sc.png"
links.image_html "<a href='http://imageshack.us/photo/my-images/822/20130514181609642x471sc.png/' target='_blank'><img src='http://imageshack.us/a/img822/6703/20130514181609642x471sc.png' alt='Free Image Hosting at www.ImageShack.us' border='0'/></a>'"
links.image_bb "[URL=http://imageshack.us/photo/my-images/822/20130514181609642x471sc.png/][IMG]http://imageshack.us/a/img822/6703/20130514181609642x471sc.png[/IMG][/URL]"
links.image_bb2 "[url=http://imageshack.us/photo/my-images/822/20130514181609642x471sc.png/][img=http://imageshack.us/a/img822/6703/20130514181609642x471sc.png][/url]"
links.thumb_link "<a href='http://imageshack.us/photo/my-images/822/20130514181609642x471sc.png/' target='_blank'><img src='http://img822.imageshack.us/img822/6703/20130514181609642x471sc.th.png' alt='Free Image Hosting at www.ImageShack.us' border='0'/></a>'"
links.thumb_bb "[URL=http://imageshack.us/photo/my-images/822/20130514181609642x471sc.png/][IMG]http://img822.imageshack.us/img822/6703/20130514181609642x471sc.th.png[/IMG][/URL]"
links.thumb_bb2 "[url=http://imageshack.us/photo/my-images/822/20130514181609642x471sc.png/][img=http://img822.imageshack.us/img822/6703/20130514181609642x471sc.th.png][/url]"
links.is_link "http://imageshack.us/photo/my-images/822/20130514181609642x471sc.png/"
links.done "http://imageshack.us/content_round.php?page=done&l=img822/6703/20130514181609642x471sc.png"
/home/abodnya/KPI/Projects/build-testNetworkQt-3-Desktop_Qt_5_0_2_GCC_32bit-Debug/testNetworkQt-3 завершился с кодом 0


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 16, 2013, 18:55
и мне интересно, почему все-таки не заработала zlib
на скрине видно, что либа есть

открой файл zlib.h тут /opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib
и попробуй найти там:
inflateInit2_
inflate
inflateEnd

если найдет
из class.h удали include "zlib.h" (хотя его итак тут не надо было инклюдить)
в class.cpp замени #include "zlib.h" на
#include "/opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib/zlib.h"

ну и в код воткни функцию uncompress


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 19:03
#include "/opt/Qt5.0.2/5.0.2/Src/qtbase/src/3rdparty/zlib/zlib.h" - вот так уже делал когда не работала)
Не помогло.
Макросы эти находит. Это и логично, ведь ругался не компилятор, а линкер. Видимо, библиотеку надо было как-то прописать.

Собственно работает - и супер =)
Кстати а в чем соль этого сжатия в gzip? Что это дает?


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 19:10
Спаковал это все в небольшой проектик, чтоб у других людей, которые столкнутся с такой проблемой, было хорошее готовое решение.


Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: thechicho от Май 16, 2013, 19:13
хм, может действительно с этим ключом -system-zlib либа собиралась
и zlib воспользоваться нельзя без ребилда qt с ключом -qt-zlib

//Кстати а в чем соль этого сжатия в gzip? Что это дает?
экономию трафика. если браузер и сервер поддерживают gzip, то сайты приходят на твой комп в сжатом виде. браузер их на лету расжимает и ты видишь уже хтмл.
собственно здесь то же самое, только json контент приходит.


Название: Re: [РЕШЕНО] Заливка картинки на ImageHack.us средствами qnetworkaccessmanager
Отправлено: abodnya от Май 16, 2013, 19:18
Ясно. Ну впринципе для моих целей трафик - не сильно критичный параметр.
Спасибо большое за помощь !