Название: [РЕШЕНО] Заливка картинки на ImageHack.us средствами qnetworkaccessmanager Отправлено: abodnya от Май 14, 2013, 00:46 Собственно по сабжу, цель - залить файл, который лежит на ПК на сервер imagehack.us
они предоставляют API: Код: Endpoint : https://post.imageshack.us/upload_api.php Код: #ifndef WIDGET_H Код: #include "widget.h" Алгоритм заливает уже выложенную в инете картинку на сервер imagehack.us используя параметры key - персональный ключ от imagehack url - ссылка на картинку Код: q.addQueryItem("key", "СКРЫЛ В ЦЕЛЯХ БЕЗОПАСНОСТИ"); Но такой код не работает: Код: q.addQueryItem("fileupload", "/home/abodnya/walp1.png"); Код: <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 Код: #------------------------------------------------- Код: #ifndef CLASS_H Код:
Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager Отправлено: abodnya от Май 16, 2013, 00:43 В одно сообщение не влезло)
cpp (продолжение) Код: void Class::parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend) Код: /home/abodnya/KPI/Projects/testNetworkQt-2/class.cpp:-1: In member function 'void Class::parseJson(QHash<QString, QString>&, const QString&, const QString&)': Название: 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) 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* Пересобирать кьют как-то не хочется ) В ручную пару раз пробывал собрать (то версию для андроида, то статически под винду). Постоянно непонятные проблемы возникали, ниразу не вышло Название: 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 Название: 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... Название: Re: Заливка картинки на ImageHack.us средствами qnetworkaccessmanager Отправлено: thechicho от Май 16, 2013, 18:50 нубас)
регулярку поменяй в функции, я же написал, что форум изменил ее Код: void Gui::parseJson(QHash<QString, QString> &jsonElements, const QString &strIndexIn, const QString &prepend) так надо Название: 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... Название: 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 Ясно. Ну впринципе для моих целей трафик - не сильно критичный параметр.
Спасибо большое за помощь ! |