POCO:如何在C++中使用POCO上传图像到Web服务器

8

我尝试将图像上传到远程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方法提交表单,这些参数将与你尝试上传的图像一起发送到同一个数据块中。 - Cesar Ortiz
2个回答

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表单文件。


0
如果你可以上传文件到本地服务器但无法上传到远程服务器,首先应该检查远程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& requestBody);

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

并且使用这个构造函数:

HTMLForm:

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

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

在你的例子中,你使用了哪个构造函数?

另一方面,

addPart:

void addPart( const std::string & name, PartSource * pSource ); 将一个部件/附件(文件上传)添加到表单中。表单将拥有该PartSource并在不再需要时删除它。只有当表单设置的编码为"multipart/form-data"时,该部分才会被发送

尝试使用"multipart/form-data"与addPart和HTMLForm的第二个构造函数。

如果不起作用,请尝试使用网络嗅探器(如Wireshark)检查您正在发送什么。

检查您的请求的Content-Length头是否具有sizeof(您的图像)+ sizeof(“aaaaaa”和“cccccc”参数)。或尝试使用GET方法而不是POST发送您的表单。

让我知道它是否有效。

敬礼


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接