c++ http 图片上传
时间: 2023-10-10 17:05:07 浏览: 234
要上传图片,您需要使用HTTP POST请求。在C++中,您可以使用许多HTTP客户端库来完成此操作,例如:
1. libcurl:一个广泛使用的C语言库,用于在各种协议上进行数据传输。它支持HTTP、HTTPS、FTP等协议,可以在Windows、Linux和Mac OS X等平台上运行。
以下是使用libcurl上传文件的示例代码:
```
#include <stdio.h>
#include <curl/curl.h>
int main(int argc, char *argv[])
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/upload");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "file",
CURLFORM_FILE, "image.jpg",
CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
curl_formfree(formpost);
}
return 0;
}
```
在这里,我们使用了`curl_formadd`函数添加了文件上传表单数据。`CURLFORM_COPYNAME`设置表单字段名称,`CURLFORM_FILE`指定了上传的文件名。在这个例子中,我们上传了名为`image.jpg`的文件。
2. Poco库:一个跨平台的C++库,提供了许多功能,包括HTTP客户端和服务器。它支持HTTP、HTTPS、FTP和SMTP等协议。
以下是使用Poco库上传文件的示例代码:
```
#include <iostream>
#include <fstream>
#include "Poco/Net/HTTPClientSession.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h"
#include "Poco/Net/FilePartSource.h"
#include "Poco/Path.h"
using namespace Poco;
using namespace Poco::Net;
int main(int argc, char** argv)
{
try {
HTTPClientSession session("example.com", 80);
HTTPRequest request(HTTPRequest::HTTP_POST, "/upload");
FilePartSource* pFPS = new FilePartSource("image.jpg");
PartSource* pPS = pFPS;
request.setContentType("multipart/form-data");
request.setChunkedTransferEncoding(true);
request.set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
PartSource* pPS = new FilePartSource("image.jpg");
MessageHeader header;
pPS->prepareHeader(header);
std::istream& rs = pPS->stream();
std::ostringstream ostr;
ostr << rs.rdbuf();
std::string s = ostr.str();
request.setContentLength(s.length());
std::ostream& os = session.sendRequest(request);
std::istringstream istr(s);
os << istr.rdbuf();
HTTPResponse response;
std::istream& is = session.receiveResponse(response);
std::cout << response.getStatus() << " " << response.getReason() << std::endl;
}
catch (Exception& e) {
std::cerr << e.displayText() << std::endl;
return 1;
}
return 0;
}
```
在这个例子中,我们使用了`FilePartSource`类来指定要上传的文件。我们还设置了请求头部信息,包括`Content-Type`和`User-Agent`,以及请求体数据。最后,我们使用`HTTPClientSession`类发送请求并接收响应。
这里提供了两种不同的方法来上传文件,您可以选择其中一种来实现您的需求。
阅读全文