c++ http 图片上传
时间: 2023-09-12 08:05:52 浏览: 164
要在C++中进行HTTP图片上传,可以使用以下步骤:
1. 使用WinInet库或Curl库来发送HTTP POST请求。
2. 设置POST请求头,包括Content-Type和Content-Length。
3. 将图片数据作为POST请求的正文发送。
以下是使用WinInet库进行图片上传的示例代码:
```
#include <windows.h>
#include <wininet.h>
#include <iostream>
#include <fstream>
#pragma comment(lib, "Wininet.lib")
int main(int argc, char* argv[])
{
// 打开Internet连接
HINTERNET hInternet = InternetOpenA("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (!hInternet)
{
std::cout << "InternetOpen failed: " << GetLastError() << std::endl;
return 1;
}
// 打开HTTP连接
HINTERNET hConnect = InternetConnectA(hInternet, "example.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (!hConnect)
{
std::cout << "InternetConnect failed: " << GetLastError() << std::endl;
InternetCloseHandle(hInternet);
return 1;
}
// 打开HTTP请求
HINTERNET hRequest = HttpOpenRequestA(hConnect, "POST", "/upload.php", NULL, NULL, NULL, 0, 0);
if (!hRequest)
{
std::cout << "HttpOpenRequest failed: " << GetLastError() << std::endl;
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return 1;
}
// 设置HTTP请求头
const char* szHeaders = "Content-Type: image/jpeg\r\n";
if (!HttpAddRequestHeadersA(hRequest, szHeaders, strlen(szHeaders), HTTP_ADDREQ_FLAG_REPLACE))
{
std::cout << "HttpAddRequestHeaders failed: " << GetLastError() << std::endl;
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return 1;
}
// 打开图片文件
std::ifstream file("test.jpg", std::ios::binary);
if (!file)
{
std::cout << "Failed to open file" << std::endl;
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return 1;
}
// 获取文件大小
file.seekg(0, std::ios::end);
int fileSize = file.tellg();
file.seekg(0, std::ios::beg);
// 分配缓冲区
char* buffer = new char[fileSize];
// 读取文件数据
file.read(buffer, fileSize);
// 发送HTTP请求
if (!HttpSendRequestA(hRequest, NULL, 0, buffer, fileSize))
{
std::cout << "HttpSendRequest failed: " << GetLastError() << std::endl;
delete[] buffer;
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return 1;
}
// 获取HTTP响应
char szBuffer[1024];
DWORD dwRead = 0;
while (InternetReadFile(hRequest, szBuffer, sizeof(szBuffer), &dwRead) && dwRead != 0)
{
std::cout << std::string(szBuffer, dwRead);
}
// 释放资源
delete[] buffer;
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return 0;
}
```
在上面的示例代码中,我们使用了WinInet库来发送HTTP POST请求,并设置了Content-Type为image/jpeg。我们还打开了一个名为test.jpg的图片文件,并将其作为POST请求正文发送。最后,我们从服务器获取了HTTP响应,并将其输出到控制台上。
请注意,上面的示例代码仅适用于发送JPEG格式的图片文件。如果您要发送其他格式的图片文件,请相应地更改Content-Type。
阅读全文