POCO: как загрузить изображение в веб-браузер, используя poco в Stack Overflow

Я пытаюсь загрузить изображение на удаленный веб-сервер. Я использовал HTMLForm и FilePartSource. Я могу успешно загрузить изображение на локальный сервер (например, loclhost), но когда я пытаюсь загрузить его на удаленный сервер, ответ, полученный от удаленного веб-сервера, равен «411 Длина обязательна».
Я попытался установить request.setContentLength (sizeofimagefile), но все еще проблема.
Может кто-нибудь направить меня по этому вопросу или.
Вот мой код

    HTMLForm htmlform;
htmlform.set("aaaaaa", "bbbbbbb");
htmlform.set("cccccc", "ddddddd");
htmlform.setEncoding(HTMLForm::ENCODING_MULTIPART);

PartSource * pFileSrc = new FilePartSource("filename", "application/octet-stream");

std::istream& mystream = pFileSrc->stream();
mystream.seekg(0, std::ios::end);
int uiLength = mystream.tellg();

htmlform.addPart("file", pFileSrc);

URI uri("yyy");

HTTPClientSession session(uri.getHost(), uri.getPort());
HTTPRequest post_req(Poco::Net::HTTPRequest::HTTP_POST,"xxx",HTTPMessage::HTTP_1_1);
post_req.setKeepAlive(true);
htmlform.prepareSubmit(post_req);std::ostream& oustr = session.sendRequest(post_req);
htmlform.write(oustr);

HTTPResponse res;
std::istream& rs = session.receiveResponse(res);

std::cerr << rs.rdbuf();

заранее спасибо

5

Решение

std::ostream& oustr = session.sendRequest(post_req);
htmlform.write(oustr);

Ваш код не может назначить данные формы в объект запроса. Поэтому при вызове session.sendRequest на сервер отправляется пустой запрос. Чтобы правильно преобразовать HTMLForm в HTTPRequest, вы должны написать так:

htmlform.write (session.sendRequest (post_req));

Код загрузки изображения, который работает для меня —

    HTTPRequest request(HTTPRequest::HTTP_POST, "/fileupload/upload_file.php",    HTTPMessage::HTTP_1_1);
HTMLForm form;
form.setEncoding(HTMLForm::ENCODING_MULTIPART);
form.set("entry1", "value1");
form.set("entry2", "value2");
form.addPart("file", new FilePartSource("/home/abc/Pictures/sample.png"));
form.prepareSubmit(request);

HTTPClientSession *httpSession = new HTTPClientSession("localhost");
httpSession->setTimeout(Poco::Timespan(20, 0));
form.write(httpSession->sendRequest(request));

Poco::Net::HTTPResponse res;
std::istream &is = httpSession->receiveResponse(res);
Poco::StreamCopier::copyStream(is, std::cout);

Соответствующий сервер загрузки использует стандартный код PHP для загрузки файлов форм HTML.

4

Другие решения

Если вы можете загрузить файл на локальный сервер, но не можете с помощью удаленного сервера, сначала вы должны проверить, есть ли у вашего удаленного Apache / PHP ограничение на загрузку. Попробуйте phpinfo () на вашем удаленном сервере.

http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/

Если нет, вы должны пересмотреть свой код …

Из документации Poco по адресу:
http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

HTMLForm:

HTMLForm (const HTTPRequest & запрос, std :: istream &
requestBody);

Создает HTMLForm из данного HTTP-запроса. Загруженные файлы
молча отбрасывается
.

И с этим конструктором:

HTMLForm:

HTMLForm (const HTTPRequest & запрос, std :: istream & requestBody, PartHandler & Обработчик);

Создает HTMLForm из данного HTTP-запроса. Загруженные файлы передаются в данный PartHandler.

В вашем примере, какой конструктор вы применяете?

С другой стороны,

addPart:

void addPart (
const std :: string & название,
PartSource * pSource); Добавляет часть / вложение (выгрузка файла) в форму. Форма становится владельцем PartSource и удаляет его.
когда это больше не нужно. Часть будет отправлена ​​только если
набор кодировки для формы «multipart / form-data»

Попробуйте использовать «multipart / form-data» с addPart и вторым конструктором для HTMLForm.

Если это не работает, попробуйте использовать сетевой анализатор, например Wireshark, чтобы проверить, что вы отправляете.

Проверьте, есть ли в заголовке Content-Length вашего запроса значение sizeof (ваше изображение) + sizeof (параметры «aaaaaa» и «cccccc»). Или попробуйте отправить форму с помощью метода GET вместо POST.

Дайте мне знать, если это работает.

С уважением

0

По вопросам рекламы [email protected]