Я пытаюсь загрузить изображение на удаленный веб-сервер. Я использовал 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();
заранее спасибо
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.
Если вы можете загрузить файл на локальный сервер, но не можете с помощью удаленного сервера, сначала вы должны проверить, есть ли у вашего удаленного 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.
Дайте мне знать, если это работает.
С уважением