首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

Windows WinInet 實現 HTTP 文件下載:從請求發起到文件保存完整示例

     編輯:關於C

核心代碼實現


#include <stdio.h>
#include <windows.h>
#include <wininet.h>

#define MAXSIZE 1024
#pragma comment(lib, "Wininet.lib")

void urlopen(TCHAR* url);

int main(int argc, TCHAR* argv[]) {
    TCHAR ch[] = TEXT("https://dt.163.com/images/news/0605/news02053101_5.jpg");
    urlopen(ch);
    getchar();
    return 0;
}

void urlopen(TCHAR* url) {
    // 1. 打開網絡會話
    HINTERNET hSession = InternetOpen(
        TEXT("UrlTest"), 
        INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, 
        NULL, NULL, 0
    );
    
    if (hSession != NULL) {
        // 2. 打開 URL 連接
        HINTERNET hHttp = InternetOpenUrl(
            hSession, url, NULL, 0, 
            INTERNET_FLAG_DONT_CACHE, 0
        );
        
        BYTE Temp[MAXSIZE];
        ULONG Number = 1;
        DWORD written;
        HANDLE hFile;
        
        if (hHttp != NULL) {
            wprintf_s(TEXT("%s\n"), url);
            
            // 3. 創建本地文件
            hFile = CreateFile(
                TEXT("ysl.jpg"), 
                GENERIC_WRITE, 0, NULL, 
                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
            );
            
            if (hFile == INVALID_HANDLE_VALUE) goto hear;
            
            // 4. 循環讀取並寫入
            while (Number > 0) {
                InternetReadFile(hHttp, Temp, MAXSIZE - 1, &Number);
                Temp[Number] = '\0';
                WriteFile(hFile, Temp, Number, &written, NULL);
            }
            
            InternetCloseHandle(hHttp);
        }
        
hear:
        CloseHandle(hFile);
        InternetCloseHandle(hSession);
    }
}

關鍵 API 解析

函數作用關鍵參數
InternetOpen初始化 WinInet 會話代理設置、用戶代理字符串
InternetOpenUrl打開 URL 獲取句柄INTERNET_FLAG_DONT_CACHE 禁用緩存
InternetReadFile讀取數據到緩衝區返回實際讀取字節數
CreateFile/WriteFile本地文件創建與寫入GENERIC_WRITE、CREATE_ALWAYS
InternetCloseHandle釋放網絡句柄必須成對調用防洩漏

常見問題與優化

  1. 編碼問題:使用 TCHAR 宏適配 Unicode/ANSI 雙版本
  2. 大文件下載:增加緩衝區大小、添加進度顯示、支持斷點續傳(Range 請求頭)
  3. 錯誤處理:檢查每個 API 返回值,使用 GetLastError() 獲取詳細錯誤碼
  4. HTTPS 支持:WinInet 自動處理 SSL,無需額外配置

現代替代方案

新項目建議考慮:

  • WinHTTP:服務端場景更穩定,支持異步
  • libcurl:跨平台、功能豐富、社區活躍
  • C++ REST SDK (Casablanca):現代 C++ 風格、異步優先
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved