|
VC++ MFC上传二进制文件功能代码(使用CInternetSession和CHttpFile),以及服务端代码(JAVA springboot)
下面是一个使用 VC++ MFC 中的 `CInternetSession` 和 `CHttpFile` 上传二进制文件的示例代码,以及相应的使用 Spring Boot 的 Java 服务端代码。
### 一、VC++ MFC 客户端代码
在 VC++ MFC 中,我们可以使用 `CInternetSession` 和 `CHttpFile` 类来发送 HTTP 请求。以下是一个简单的示例代码:
- #include <afxwin.h>
- #include <afxinet.h>
- void UploadFile(const CString& filePath)
- {
- // 创建一个互联网会话
- CInternetSession session;
- CHttpFile* pHttpFile = nullptr;
- try
- {
- // 连接到服务器
- pHttpFile = (CHttpFile*)session.OpenURL(_T("http://localhost:8080/upload"), 1, NULL, NULL, INTERNET_FLAG_DONT_CACHE);
- // 打开要上传的文件
- 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);
- // 发送文件数据
- pHttpFile->Send(buffer, fileSize);
- // 接收响应
- DWORD statusCode = 0;
- pHttpFile->QueryInfoStatusCode(statusCode);
- if (statusCode == HTTP_STATUS_OK)
- {
- AfxMessageBox(_T("文件上传成功"));
- }
- else
- {
- AfxMessageBox(_T("文件上传失败"));
- }
- delete[] buffer;
- }
- catch (CInternetException* pEx)
- {
- TCHAR errorMsg[512];
- pEx->GetErrorMessage(errorMsg, 512);
- AfxMessageBox(errorMsg);
- pEx->Delete();
- }
- if (pHttpFile)
- pHttpFile->Close();
- }
复制代码
### 二、Java Spring Boot 服务端代码
在 Java Spring Boot 中,我们可以使用 `@RestController` 来处理文件上传请求。以下是一个简单的示例代码:
- import org.springframework.http.HttpStatus;
- import org.springframework.http.ResponseEntity;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RestController;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- @RestController
- public class FileUploadController {
- @PostMapping("/upload")
- public ResponseEntity<String> uploadFile(@RequestBody byte[] fileBytes) {
- // 指定文件保存路径
- String uploadPath = "C:/uploads/uploaded_file.bin"; // 请根据实际情况修改
- try (FileOutputStream fos = new FileOutputStream(new File(uploadPath))) {
- fos.write(fileBytes);
- return ResponseEntity.status(HttpStatus.OK).body("文件上传成功");
- } catch (IOException e) {
- e.printStackTrace();
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败");
- }
- }
- }
复制代码
### 代码说明
1. **VC++ MFC 客户端**
- 使用 `CInternetSession` 创建互联网会话,并使用 `CHttpFile` 发送 HTTP 请求。
- 打开要上传的文件并读取其内容。
- 设置请求头,并将文件内容作为请求体发送到服务器。
- 检查响应状态码以确定上传是否成功。
2. **Java Spring Boot 服务端**
- 使用 `@RestController` 创建文件上传控制器。
- 通过 `@PostMapping` 注解处理 POST 请求。
- 从请求体中获取文件字节数组,并将其写入指定路径的文件。
- 返回响应给客户端,指示上传是否成功。
### 注意事项
- 请确保服务器可以接收来自客户端的请求,并且文件保存路径具有写权限。
- 处理大文件时,建议使用流式处理以避免内存溢出。
- 根据实际需求,可能需要添加异常处理和日志记录。
|
|