使用POCO HTTP POST请求将文件上传到HTTPS URL时,总是返回“SSL连接意外关闭”异常。
以下是我用于分段上传文件的代码。
我也尝试使用HTML表单:
但是两种方式都返回相同的错误。 通过其他平台上传可以正常工作,因此我可以说这不是服务器问题,而是在上面的代码中出现了问题。请帮我解决这个问题。 注意:服务器不支持分块传输。服务器端错误日志显示“错误的传输编码:chunked”。尽管我没有执行分块传输。
更新: 最终我能够使用第一种代码(通过设置边界)上传文件,但是当我尝试使用以下代码从流中读取响应体时,我所说的异常(SSL连接意外关闭)会出现:
outStringStream << inStream.rdbuf();
服务器正在返回纯文本。我该怎么办?
以下是我用于分段上传文件的代码。
try
{
Poco::URI uri(uploadLink);
const Poco::Net::Context::Ptr context = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", "", Poco::Net::Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort(), context);
session.setKeepAlive(true);
// prepare path
std::string path(uri.getPathAndQuery());
if (path.empty())
{
path = "/";
}
std::cout<<"\nPath: "<<path;
std::ifstream f1 (filePath,std::fstream::binary);
std::string content((std::istreambuf_iterator<char>(f1)), std::istreambuf_iterator<char>());
std::cout<<"\n Fle Content: "<<content;
std::string boundary = "-------------------------87142694621188";
std::string data1("---------------------------87142694621188\r\nContent-Disposition: form-data; name=\"data\"; filename=\"");
std::string data2(filePath);
std::string data3("\";\r\nContent-Type: application/octet-stream\r\n\r\n");
std::string data4("\r\n---------------------------87142694621188--\r\n");
std::string reqBody = data1 +data2 +data3 + content + data4;
std::cout<<"\nReq Body: "<<reqBody.c_str();
Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, path, Poco::Net::HTTPMessage::HTTP_1_1);
req.setKeepAlive(true);
req.setContentType("multipart/form-data; boundary=-------------------------87142694621188");
req.setContentLength(reqBody.length());
// sends request, returns open stream
std::ostream& myOStream = session.sendRequest(req);
// sends the body
myOStream << reqBody;
Poco::Net::HTTPResponse res;
// get the response body from server
std::istream& inStream = session.receiveResponse(res);
std::ostringstream outStringStream;
outStringStream << inStream.rdbuf();
std::cout<< outStringStream.str();
}
catch (Poco::Exception& e)
{
std::cout <<"Upload Exception: "<< e.displayText() << std::endl;
}
我也尝试使用HTML表单:
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, path, Poco::Net::HTTPMessage::HTTP_1_1);
request.setKeepAlive(true);
request.setContentLength(1041);
Poco::Net::HTMLForm form;
form.setEncoding(Poco::Net::HTMLForm::ENCODING_MULTIPART);
form.addPart("file", new Poco::Net::FilePartSource(filePath));
form.prepareSubmit(request);
session.setTimeout(Poco::Timespan(20, 0));
form.write(session.sendRequest(request));
Poco::Net::HTTPResponse res;
std::istream &is = session.receiveResponse(res);
Poco::StreamCopier::copyStream(is, std::cout);
std::cerr << is.rdbuf();
但是两种方式都返回相同的错误。 通过其他平台上传可以正常工作,因此我可以说这不是服务器问题,而是在上面的代码中出现了问题。请帮我解决这个问题。 注意:服务器不支持分块传输。服务器端错误日志显示“错误的传输编码:chunked”。尽管我没有执行分块传输。
更新: 最终我能够使用第一种代码(通过设置边界)上传文件,但是当我尝试使用以下代码从流中读取响应体时,我所说的异常(SSL连接意外关闭)会出现:
outStringStream << inStream.rdbuf();
服务器正在返回纯文本。我该怎么办?