|
VC++MFC使用 POST 方法提交文件
使用 `CHttpFile` 类通过 POST 请求将文件上传到服务器,并添加必要的请求头。
### 改进后的代码示例
- #include <afxwin.h>
- #include <afxinet.h>
- void UploadFile(const CString& filePath)
- {
- CInternetSession session;
- CHttpFile* pHttpFile = nullptr;
- try
- {
- // 连接到服务器,使用 POST 方法
- pHttpFile = (CHttpFile*)session.OpenURL(_T("http://localhost:8080/upload"),
- 1, NULL, NULL,
- INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_NO_CACHE_WRITE);
- // 打开要上传的文件
- CFile file;
- if (!file.Open(filePath, CFile::modeRead | CFile::typeBinary))
- {
- AfxMessageBox(_T("无法打开文件"));
- return;
- }
- // 读取文件内容
- DWORD fileSize = (DWORD)file.GetLength();
- BYTE* buffer = new BYTE[fileSize];
- file.Read(buffer, fileSize);
- file.Close();
- // 设置请求头
- CString header;
- header.Format(_T("Content-Type: application/octet-stream\r\nContent-Length: %d"), fileSize);
- pHttpFile->AddRequestHeaders(header);
- // 发送 POST 请求
- pHttpFile->SendRequest(NULL, 0, buffer, fileSize);
- // 接收响应
- DWORD statusCode = 0;
- pHttpFile->QueryInfoStatusCode(statusCode);
- if (statusCode == HTTP_STATUS_OK)
- {
- AfxMessageBox(_T("文件上传成功"));
- }
- else
- {
- CString errorMsg;
- errorMsg.Format(_T("文件上传失败,状态码:%d"), statusCode);
- AfxMessageBox(errorMsg);
- }
- delete[] buffer;
- }
- catch (CInternetException* pEx)
- {
- TCHAR errorMsg[512];
- pEx->GetErrorMessage(errorMsg, 512);
- AfxMessageBox(errorMsg);
- pEx->Delete();
- }
- if (pHttpFile)
- pHttpFile->Close();
- }
复制代码
### 代码说明
1. **使用 POST 方法**:在 `OpenURL` 函数中,我们指定了使用 POST 方法来连接到服务器。
2. **设置请求头**:通过 `AddRequestHeaders` 方法设置 `Content-Type` 和 `Content-Length` ,以告知服务器我们发送的数据类型和大小。
3. **发送请求**:使用 `SendRequest` 方法发送文件数据。这里将文件内容作为请求体发送。
4. **处理响应**:通过 `QueryInfoStatusCode` 获取服务器的响应状态码,并根据状态码判断上传是否成功。
### 注意事项
- 确保服务器端有相应的处理逻辑来接收 POST 请求并处理上传的文件。
- 如果文件上传失败,可以通过服务器的日志获取更多信息,以便进行调试。
服务端代码(JAVA)参考这篇文章中的:VC++ MFC上传二进制文件功能代码(使用CInternetSession和CHttpFile),以及服务端代码(JAVA springboot) |
|