Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Залить jpg картинку
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
Verus
Суть в том что вроде бы заголовок сформировал если верить сниферу, но при попытке отправить файл в ответ получаю 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
А ты получешь передаешь кукисы?
Если нет, то это тоже нужно делать...
Verus
Дело не в кукисах, там в ссылке передается jsessionId.
SABROG
У меня почему-то одноклассники кукисы всегда сбрасывает и мне приходится вручную вводить логин и пароль при каждом заходе. Кроме того, я заметил, что еще какой-то их сервер ставит вторые кукисы.

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

P.S.: народ, че за западло, внутри блока [ code][/ code] нельзья написать &аmp; (букву "a" поставил русскую спецом) ?
Litkevich Yuriy
SABROG, ты это в обратную связь напиши, там Багира заметит, а тут нет.
Verus
Цитата(SABROG @ 1.4.2009, 22:43) *
У меня почему-то одноклассники кукисы всегда сбрасывает и мне приходится вручную вводить логин и пароль при каждом заходе. Кроме того, я заметил, что еще какой-то их сервер ставит вторые кукисы.

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

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


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

P.S. мне казалось что &аmp; это просто "&", а не русская "а". Так то не западло :)
Litkevich Yuriy
Цитата(Verus @ 2.4.2009, 12:44) *
а не русская "а".
он про другое, про то что написал букву А в записи &аmp;, чтобы не проглатилась движком форума как html-сущьность
Verus
Ясно :)
Может все таки есть у кого мысли по поводу проблемы? :)
ViGOur
Цитата(Verus @ 2.4.2009, 9:44) *
Вполне хватает jsession, даже когда прога получает его, можно скопировать эту строку и в браузере откроется страница одноклассников без авторизации.
В тот же броузер или в другом, в котором "чистенько"? :)

Хм, попробовал и правда так...
Verus
Странное дело наблюдается - если нет этой строки
setHost(urlHost, QHttp::ConnectionModeHttp);


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

Заголовки сравнил в снифере, один в один и ничем не отличаются :)
Verus
А может у кого-то есть опыт заливания картинок на сервер с помощью Qhttp? Показали бы, было бы здорово :)
kwisp
Verus,
опыта нет, но думаю засовывать картинку в QByteArray и отправлять на сервер там загружать картинку из того же QByteArray.
в чем конкретно проблема не понятно.
Verus
Может я конечно криворукий, но просто я не могу понять что я делаю не так :( Попробуй загрузить картинку каким-нибудь способом(только с Qt) на одноклассники, если получится, поделись :)
LE0N
Сомневаюсь я, что это скрипты одноклассников возвращают такой заголовок.
Скорее всего самому веб-серверу не нравится то, что ты передаёшь...
Читай про ХТТП заголовки спецуху...
ЗЫ. Возможно это какая-нибудь хитрожопая защита одноклассников от роботов...И бэд реквест выдаёт именно бизнес логика этой соц. сети...
kwisp
Verus,
польщен предложением но есть чем заняться и без этого... это как я понимаю не пятиминутное дело если честно не предполагал что сервер вообще не твой:)
тут правда Qt не причем протокол все решает ....

можно просмотреть что и как посылается с помощью программ снифферов я пользуюсь ethereal хорошая вещь... посмотришь как картинку посылает браузер состряпаешь такой же запрос серверу должно сработать....
ViGOur
Я думаю, что для начала стоит попробовать залить картинку на свой сервер, на котором поставить полный доступ на заливку, и когда уже это получится пробовать это сделать на чужой.
Verus
Вот недавно заливал картинку на антикапчу. Все успешно заливается таким способом:
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 и все тут.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.