返回
WinInet 的魔力:让文件上传下载成为 Win32 程序的囊中之物
后端
2022-11-20 14:20:28
通过 WinInet API 实现文件传输
WinInet 是 Microsoft Windows API 库,为开发人员提供了广泛的互联网功能,包括文件传输。使用 WinInet,您可以轻松地从应用程序中上传和下载文件。
文件上传
步骤 1:初始化 WinInet
HINTERNET hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
步骤 2:建立 HTTP 会话
HINTERNET hHttpSession = InternetConnect(hInternet, "www.example.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
步骤 3:创建 HTTP 请求
HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "POST", "/upload.php", HTTP_VERSION_1_1, NULL, NULL, INTERNET_FLAG_RELOAD, 0);
步骤 4:设置请求头
HttpAddRequestHeaders(hHttpRequest, "Content-Type: multipart/form-data; boundary=---------------------------1234567890", -1L, HTTP_ADDREQ_FLAG_ADD);
步骤 5:发送请求正文
InternetWriteFile(hHttpRequest, "-----------------------------1234567890\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.txt\"\r\nContent-Type: text/plain\r\n\r\nThis is a test file.\r\n-----------------------------1234567890--\r\n", -1L, &bytesWritten);
步骤 6:读取服务器响应
char buffer[4096];
DWORD bytesRead;
while (InternetReadFile(hHttpRequest, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
// 处理服务器响应
}
步骤 7:关闭连接
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hInternet);
文件下载
步骤 1:初始化 WinInet
HINTERNET hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
步骤 2:建立 HTTP 会话
HINTERNET hHttpSession = InternetConnect(hInternet, "www.example.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
步骤 3:创建 HTTP 请求
HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "GET", "/download.php?file=test.txt", HTTP_VERSION_1_1, NULL, NULL, INTERNET_FLAG_RELOAD, 0);
步骤 4:发送请求
InternetSendRequest(hHttpRequest, NULL, 0, NULL, 0);
步骤 5:读取服务器响应
char buffer[4096];
DWORD bytesRead;
while (InternetReadFile(hHttpRequest, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
// 处理服务器响应
}
步骤 6:关闭连接
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hInternet);
常见问题解答
-
如何在 WinInet 中设置代理?
- 使用 InternetSetOption 函数,指定 INTERNET_OPTION_PROXY 的选项值。
-
如何处理 WinInet 中的错误?
- 使用 InternetGetLastResponseInfo 函数获取错误代码,然后使用 InternetErrorString 函数获取错误消息。
-
如何设置 WinInet 中的超时?
- 使用 InternetSetOption 函数,指定 INTERNET_OPTION_CONNECT_TIMEOUT 和 INTERNET_OPTION_RECEIVE_TIMEOUT 的选项值。
-
如何处理 WinInet 中的大型文件上传或下载?
- 使用 InternetReadFileEx 函数,它允许使用分块传输,从而提高效率。
-
如何使用 WinInet 访问安全网站?
- 使用 HttpAddRequestHeaders 函数设置授权头,指定用户名和密码。