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

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

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Залить jpg картинку

Автор: Verus 1.4.2009, 18:22

Суть в том что вроде бы заголовок сформировал если верить сниферу, но при попытке отправить файл в ответ получаю Bad Request.

_header = GetUploadHeader(urlHost, reqStr), _photos[0]);
_httpId = request(_header, _byteTosend);
_loop.exec();
QHttpRequestHeader GetUploadHeader(QString urlHost, const QString &request, const QString filePath)
{
    _byteTosend.clear();
    QFile userfile(filePath);
    if (!userfile.open(QFile::ReadOnly))
    {
        QMessageBox::information(0, "File Upload error",
            QString("Unable to open the file %1: %2.").arg(filePath).arg(userfile.errorString()));
    }
    setHost(urlHost, QHttp::ConnectionModeHttp);
    QHttpRequestHeader header("POST", request);
    header.setValue("Host", urlHost);
    header.setValue("Content-type", "multipart/form-data; boundary=---------------------------21974107111333");
    header.setValue("Cache-Control", "no-cache");
    header.setValue("Connection","Keep-Alive");
    _byteTosend.append("-----------------------------21974107111333\r\n");
    _byteTosend.append("content-disposition: form-data; name=\"st.filename\"; filename=\""+
        filePath+"\""+
        "\r\nContent-Type: image/jpeg\r\n\r\n");      
    _byteTosend.append(userfile.readAll());
    _byteTosend.append("\r\n-----------------------------21974107111333--\r\n");
    userfile.close();
    header.setContentLength(_byteTosend.length());
    return header;
}


Может я POST запрос сам формирую не правильно? Вот форма по которой происходит отправка файла:

<input value="Загрузить фотографию" onclick="..." type="submit" name="button_upload">
<input value="" id="field_filename" type="file" name="st.filename">
<form action="http://u10.odnoklassniki.ru/uploadImage?photoId=
jQa5VZyH5Xexs9SflOKHqNBJSBy75R7Dttt0xIGyw2Gw7wP0wTzpWTrnDJL5h%2FN8Dfj4Ylo8PdqO%0AHZ3aNMfoyFSAJ5bFOE5bOZ21sqnk3c0=
        &amp;returnUrl=http://wg24.odnoklassniki.ru/dk
        ?st.cmd=userEditPhoto
        &amp;st.photoIds=176090490981
        &amp;st.action=EditComment
        &amp;st.referer=userPersonalPhotos
        &amp;returnErrorUrl=http://wg24.odnoklassniki.ru/dk
                    ?st.cmd=userAddPhoto
                    &amp;st.referer=userPersonalPhotos" method="post" enctype="multipart/form-data">


Я в пост запросе указываю только эту строку как есть ничего не дописывая. Помогите кто чем может :)

Автор: ViGOur 1.4.2009, 19:34

А ты получешь передаешь кукисы?
Если нет, то это тоже нужно делать...

Автор: Verus 1.4.2009, 21:25

Дело не в кукисах, там в ссылке передается jsessionId.

Автор: SABROG 1.4.2009, 21:43

У меня почему-то одноклассники кукисы всегда сбрасывает и мне приходится вручную вводить логин и пароль при каждом заходе. Кроме того, я заметил, что еще какой-то их сервер ставит вторые кукисы.

Вообще еще javascript может ставить кукисы и если какой-то бот лазит по сайтам, то он эти кукисы не получит никогда, т.к. не умеет обрабатывать скрипты, а стало быть и не зайдет на сайт.

P.S.: народ, че за западло, внутри блока [ code][/ code] нельзья написать &аmp; (букву "a" поставил русскую спецом) ?

Автор: Litkevich Yuriy 2.4.2009, 7:00

SABROG, ты это в обратную связь напиши, там Багира заметит, а тут нет.

Автор: Verus 2.4.2009, 8:44

Цитата(SABROG @ 1.4.2009, 22:43) *
У меня почему-то одноклассники кукисы всегда сбрасывает и мне приходится вручную вводить логин и пароль при каждом заходе. Кроме того, я заметил, что еще какой-то их сервер ставит вторые кукисы.

Вообще еще javascript может ставить кукисы и если какой-то бот лазит по сайтам, то он эти кукисы не получит никогда, т.к. не умеет обрабатывать скрипты, а стало быть и не зайдет на сайт.

P.S.: народ, че за западло, внутри блока [ code][/ code] нельзья написать &аmp; (букву "a" поставил русскую спецом) ?


Вполне хватает jsession, даже когда прога получает его, можно скопировать эту строку и в браузере откроется страница одноклассников без авторизации. Даже в хедере Set-Cookie содержится строка что куки истекают в 1904 году :)

P.S. мне казалось что &аmp; это просто "&", а не русская "а". Так то не западло :)

Автор: Litkevich Yuriy 2.4.2009, 8:47

Цитата(Verus @ 2.4.2009, 12:44) *
а не русская "а".
он про другое, про то что написал букву А в записи &аmp;, чтобы не проглатилась движком форума как html-сущьность

Автор: Verus 2.4.2009, 8:58

Ясно :)
Может все таки есть у кого мысли по поводу проблемы? :)

Автор: ViGOur 2.4.2009, 9:33

Цитата(Verus @ 2.4.2009, 9:44) *
Вполне хватает jsession, даже когда прога получает его, можно скопировать эту строку и в браузере откроется страница одноклассников без авторизации.
В тот же броузер или в другом, в котором "чистенько"? :)

Хм, попробовал и правда так...

Автор: Verus 2.4.2009, 9:54

Странное дело наблюдается - если нет этой строки

setHost(urlHost, QHttp::ConnectionModeHttp);


то в снифере видно POST запрос, если добавить ее, то нет и видно сразу ответ(400 Bad Request), хотя не совсем понятно почему так получается.

Заголовки сравнил в снифере, один в один и ничем не отличаются :)

Автор: Verus 4.4.2009, 14:53

А может у кого-то есть опыт заливания картинок на сервер с помощью Qhttp? Показали бы, было бы здорово :)

Автор: kwisp 4.4.2009, 17:28

Verus,
опыта нет, но думаю засовывать картинку в QByteArray и отправлять на сервер там загружать картинку из того же QByteArray.
в чем конкретно проблема не понятно.

Автор: Verus 4.4.2009, 18:44

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

Автор: LE0N 4.4.2009, 22:44

Сомневаюсь я, что это скрипты одноклассников возвращают такой заголовок.
Скорее всего самому веб-серверу не нравится то, что ты передаёшь...
Читай про ХТТП заголовки спецуху...
ЗЫ. Возможно это какая-нибудь хитрожопая защита одноклассников от роботов...И бэд реквест выдаёт именно бизнес логика этой соц. сети...

Автор: kwisp 4.4.2009, 23:29

Verus,
польщен предложением но есть чем заняться и без этого... это как я понимаю не пятиминутное дело если честно не предполагал что сервер вообще не твой:)
тут правда Qt не причем протокол все решает ....

можно просмотреть что и как посылается с помощью программ снифферов я пользуюсь ethereal хорошая вещь... посмотришь как картинку посылает браузер состряпаешь такой же запрос серверу должно сработать....

Автор: ViGOur 4.4.2009, 23:53

Я думаю, что для начала стоит попробовать залить картинку на свой сервер, на котором поставить полный доступ на заливку, и когда уже это получится пробовать это сделать на чужой.

Автор: Verus 16.4.2009, 12:58

Вот недавно заливал картинку на антикапчу. Все успешно заливается таким способом:

QHttpRequestHeader Network::GetFileHeader(const QString& fileName)
{
    QFile file(fileName);
    file.open(QFile::ReadOnly);
    QByteArray boundary = "-------------fjfhee78y34uhui";
    QHttpRequestHeader header("POST", "/in.php");
    _bytesToSend = "--"+boundary+"\r\n"+
    "Content-Disposition: form-data; name=\"method\"\r\n\r\npost\r\n"+
    "--"+boundary+"\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\n"+_ackey.toUtf8()+"\r\n"+
    "--"+boundary+"\r\nContent-Disposition: form-data; name=\"file\"; filename=\""+fileName.toUtf8()+"\"\r\n"+
    "Content-Type: image/pjpeg\r\n\r\n"+file.readAll()+"\r\n--"+boundary+"--";

    header.setContentLength(_bytesToSend.size());
    header.setValue("Host", "ac-service.info");
    header.setValue("User-Agent",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8");
    header.setContentType("multipart/form-data; boundary="+boundary);
    setHost("ac-service.info", QHttp::ConnectionModeHttp);
    return header;
}

Одноклассники же упорно сопротивляются. Так же выяснил с помощью firebug'a что если через браузер заливать картинку то ответ от сервера тоже 400(Bad Request), но перед этим в заголовке в поле Location: указывается страница, которую браузер потом открывает GET'ом для добавления комента к фотке. Средствами Qt в заголовке такого пункта нет, т.е. получаю просто 400 и все тут.

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