【问题标题】:POCO : How to upload image to webser using poco in c++POCO:如何在 c++ 中使用 poco 将图像上传到 webser
【发布时间】:2012-12-07 17:38:11
【问题描述】:

我正在尝试将图像上传到远程 Web 服务器。我使用过 HTMLForm 和 FilePartSource。我能够成功地将图像上传到本地服务器(即 loclhost),但是当我尝试将其上传到远程服务器时,从远程 Web 服务器收到的响应是“需要 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(); 

提前致谢

【问题讨论】:

  • 在 setContentLength(sizeofimagefile) 中,您是否在请求数据块中包含了随图像一起发送的参数“aaaaaa”和“cccccc”的大小?如果您对表单使用 POST 方法,这些参数将转到与您尝试上传的图像相同的数据块。

标签: c++ image upload poco-libraries


【解决方案1】:
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表单文件。

【讨论】:

    【解决方案2】:

    如果您可以将文件上传到本地服务器但不能使用远程服务器,首先您应该检查远程 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 & request, std::istream & 请求体);

    从给定的 HTTP 请求创建一个 HTMLForm。 上传的文件是 默默地丢弃

    使用这个构造函数:

    HTMLForm:

    HTMLForm(const HTTPRequest & request, std::istream & requestBody, PartHandler & handler);

    从给定的 HTTP 请求创建一个 HTMLForm。 上传的文件被传递给给定的 PartHandler

    在您的示例中,您应用的是什么构造函数?

    另一方面,

    添加部分:

    无效添加部分( const std::string & 名称, 零件来源 * pSource );向表单添加部分/附件(文件上传)。表单获取 PartSource 的所有权并将其删除 当不再需要它时。 只有在 表单的编码集是“multipart/form-data”

    尝试将“multipart/form-data”与 addPart 和 HTMLForm 的第二个构造函数一起使用。

    如果它不起作用,请尝试使用像 Wireshark 这样的网络嗅探器来检查您发送的内容。

    检查您的请求的 Content-Length 标头是否包含 sizeof(your image) + sizeof("aaaaaa" 和 "cccccc" params)。 或者尝试使用 GET 方法发送您的表单POST。

    让我知道它是否有效。

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多