MFC如何上传图片到 http://169.254.1.10:8090/api/v1/~bali/ABC0123456789
时间: 2023-10-05 11:05:12 浏览: 144
aurora-engine/aurora
首先,需要使用C++中的WinINet库来实现HTTP上传功能。具体步骤如下:
1. 使用`InternetOpen()`函数打开一个应用程序与Internet之间的连接。
2. 使用`InternetConnect()`函数连接到服务器。
3. 使用`HttpOpenRequest()`函数创建一个HTTP请求。
4. 使用`HttpAddRequestHeaders()`函数添加HTTP请求头。
5. 使用`HttpSendRequest()`函数发送HTTP请求。
6. 使用`InternetWriteFile()`函数将文件内容发送到服务器。
7. 使用`InternetReadFile()`函数读取服务器返回的响应。
8. 使用`InternetCloseHandle()`函数关闭连接。
具体实现代码如下:
```cpp
CString strURL = _T("http://169.254.1.10:8090/api/v1/~bali/ABC0123456789");
CString strFilePath = _T("D:\\test.jpg");
HINTERNET hInternet = InternetOpen(
_T("MyApp"), // User Agent
INTERNET_OPEN_TYPE_PRECONFIG, // Access Type
NULL, // Proxy Name
NULL, // Proxy Bypass
0 // Flags
);
if (!hInternet)
{
AfxMessageBox(_T("InternetOpen failed!"));
return;
}
HINTERNET hConnect = InternetConnect(
hInternet,
_T("169.254.1.10"), // Server Name
8090, // Port Number
NULL, // User Name
NULL, // Password
INTERNET_SERVICE_HTTP, // Service Type
0, // Flags
0 // Context
);
if (!hConnect)
{
InternetCloseHandle(hInternet);
AfxMessageBox(_T("InternetConnect failed!"));
return;
}
HINTERNET hRequest = HttpOpenRequest(
hConnect,
_T("POST"), // HTTP Verb
strURL, // Object Name
NULL, // Version
NULL, // Referrer
NULL, // Accept Types
INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD, // Flags
0 // Context
);
if (!hRequest)
{
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
AfxMessageBox(_T("HttpOpenRequest failed!"));
return;
}
CString strHeaders = _T("Content-Type: image/jpeg\r\n");
if (!HttpAddRequestHeaders(hRequest, strHeaders, strHeaders.GetLength(), HTTP_ADDREQ_FLAG_ADD))
{
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
AfxMessageBox(_T("HttpAddRequestHeaders failed!"));
return;
}
if (!HttpSendRequest(hRequest, NULL, 0, NULL, 0))
{
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
AfxMessageBox(_T("HttpSendRequest failed!"));
return;
}
CFile file;
if (!file.Open(strFilePath, CFile::modeRead))
{
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
AfxMessageBox(_T("Open file failed!"));
return;
}
BYTE buf[1024];
DWORD dwRead = 0, dwWritten = 0;
while ((dwRead = file.Read(buf, sizeof(buf))) > 0)
{
if (!InternetWriteFile(hRequest, buf, dwRead, &dwWritten))
{
file.Close();
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
AfxMessageBox(_T("InternetWriteFile failed!"));
return;
}
}
file.Close();
char szResponse[1024];
DWORD dwSize = sizeof(szResponse);
if (!InternetReadFile(hRequest, szResponse, sizeof(szResponse), &dwSize))
{
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
AfxMessageBox(_T("InternetReadFile failed!"));
return;
}
szResponse[dwSize] = '\0';
AfxMessageBox(szResponse);
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
```
需要注意的是,上传的文件必须是二进制文件,并且需要指定HTTP请求头的Content-Type为image/jpeg。另外,上传文件的大小不能超过服务器端设置的最大限制。
阅读全文