Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ загрузка картинки на сайт методом пост multipart/form-data

Автор: eldar85 15.10.2010, 10:47

никак не пойму как создать массив байтов multipart/form-data чтобы отправить картинку на сайт с помощью qnetworkaccessmanager. Кто нибудь пробывал подобное, нифига не получается.

Автор: kwisp 15.10.2010, 11:04

eldar85,
вот схожие темы
http://www.forum.crossplatform.ru/index.php?showtopic=2502&hl=multipart/form-data
http://www.forum.crossplatform.ru/index.php?showtopic=1905&hl=multipart/form-data

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 RFC только на английском
http://www.qtcentre.org/archive/index.php/t-25255.html

Автор: eldar85 16.10.2010, 9:55

http://www.qtcentre.org/archive/index.php/t-25255.html
тут вроде китаец привел не плохой пример, буду разбираться, теперь хоть ясно в какую сторону копать, а то почти везде используется QHTTP а я хочу с помощью QNetworkAсcessManager все сделать)) как получиться выложу код)

Автор: kwisp 16.10.2010, 11:06

Цитата(eldar85 @ 16.10.2010, 10:55) *
как получиться выложу код)

обязательно, лучше с подробными комментариями.

Автор: ufna 16.10.2010, 13:04

В принципе, все очень просто - http://ufna.ru/2010/10/16/qt-post-multipart-form-data

Автор: eldar85 16.10.2010, 20:40

хмм, вроде все ясно но не выходит, мне нужно сформировать подобного вида отправляемый бинарник

    curl_formadd(&post, &last,   CURLFORM_COPYNAME, "method",   CURLFORM_COPYCONTENTS, "post", CURLFORM_END);  
    curl_formadd(&post, &last,   CURLFORM_COPYNAME, "key",   CURLFORM_COPYCONTENTS, ackey.c_str(), CURLFORM_END);  
    curl_formadd(&post, &last,   CURLFORM_COPYNAME, "file",   CURLFORM_FILE, img.c_str(), CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END);


это отправка курлом, мне нужно сделать подобное методами Qt.
Сделал вот так

QByteArray array;
    array.append("-----------------------------200242615429510\r\n");
    array.append("content-disposition: ");
    array.append("method=post");
    array.append("\r\n");
    array.append("-----------------------------200242615429510\r\n");
    array.append("content-disposition: ");
    array.append("key=a1683bc4a2768f2c0jhkjhklliui15");
    array.append("\r\n");
    array.append("-----------------------------200242615429510\r\n");
    array.append("Content-Transfer-Encoding: binary\r\n");
    array.append("\r\n");
    array.append(file.readAll());
    array.append("\r\n");
    array.append("-----------------------------200242615429510--");

    qDebug() << array;
    QNetworkAccessManager* pManager = new QNetworkAccessManager();
    QNetworkReply *reply = pManager->post(request, array);
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    qDebug() << reply->readAll();


но отправка получается неправельной.

Автор: ufna 16.10.2010, 21:23

ну ты key неверно задаешь

сделай как в моем примере, поставь key вместо моего __PARAM_NAME__, а его значение - вместо "__your PARAM_NAME data in TEXT__"

Автор: ufna 16.10.2010, 21:57

file кстати тоже не задаешь. Сделай как у меня - это проверенный вариант

Автор: eldar85 16.10.2010, 22:16

спасибо, сейчас попробую))

Автор: eldar85 16.10.2010, 22:54

QNetworkRequest request;
    QEventLoop loop;
    
    
    QFile file("c:/8788.jpg");
    if(!file.open(QIODevice::ReadOnly)) {qDebug() << "error"; return 1;}
    
    
    request.setRawHeader("Host", "yoursait.com");
    request.setUrl(QUrl("http://yoursait.com/in.php"));
    request.setRawHeader("Content-Type", "multipart/form-data; boundary=---------------------------200242615429510");
    
    
    QByteArray array;
    array.append("-----------------------------200242615429510\r\n");
    array.append("Content-disposition: ");
    array.append("form-data; name=\"method\"\r\n");
    array.append("\r\n");
    array.append("post");
    array.append("\r\n");
    array.append("-----------------------------200242615429510\r\n");
    array.append("Content-disposition: ");
    array.append("form-data; name=\"key\"\r\n");
    array.append("\r\n");
    array.append("a1683bc4jhkjhkhkgutiuftsdrsr62dkiu");
    array.append("\r\n");
    array.append("-----------------------------200242615429510\r\n");
    array.append("-----------------------------200242615429510\r\n");
    array.append("Content-disposition: ");
    array.append("form-data; name=\"file\"; filename=\"img.jpg\"\r\n");
              array.append("Content-Type: image/jpeg");
    array.append("\r\n");
    array.append("\r\n");
    array.append(file.readAll());
    array.append("\r\n");
    array.append("-----------------------------200242615429510--");
    
    qDebug() << array;
    QNetworkAccessManager* pManager = new QNetworkAccessManager();
    QNetworkReply *reply = pManager->post(request, array);
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    qDebug() << reply->readAll();
    
    return 0;


вот в таком виде все работает отлично)) спасибо за помощь)

Автор: eldar85 16.10.2010, 23:39

и к стати отличный сайт у тебя и главное родственная душа, я тоже фрилансер)) freedom forever)))

Автор: ufna 17.10.2010, 12:36

Цитата(eldar85 @ 17.10.2010, 0:39) *
и к стати отличный сайт у тебя и главное родственная душа, я тоже фрилансер)) freedom forever)))


пасиб ;)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)