衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

windows下C語言使用curl庫訪問HTTP下載文件

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:57 ? 次閱讀

【摘要】 cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發(fā)行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統(tǒng),習慣稱cURL為下載工具。cURL還包含了用于程序開發(fā)的libcurl。

一、前言

cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發(fā)行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統(tǒng),習慣稱cURL為下載工具。cURL還包含了用于程序開發(fā)的libcurl。

cURL支持的通信協(xié)議有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

curl還支持SSL認證、HTTP POST、HTTP PUT、FTP上傳, HTTP form based upload、proxies、HTTP/2、cookies、用戶名+密碼認證(Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos)、file transfer resume、proxy tunneling。

二、curl下載

curl for windows : https://curl.se/windows/

下載頁面如圖:

image-20220513134431494image-20220513134501163

解壓后的可執(zhí)行文件位置:

image-20220513134530563

下面是解壓后的文件目錄:

image-20220513134631915

在命令行使用curl測試下載文件:

image-20220513134729784

三、通過命令行使用curl

curl可以直接調(diào)用函數(shù)庫完成功能設(shè)計、也可以直接調(diào)用可執(zhí)行文件完成需要的功能,下面這里就介紹,在windows下,通過CreateProcess調(diào)用curl命令函數(shù)完成文件下載。使用curl實現(xiàn)HTTP協(xié)議文件下載成功,通過給定的連接地址,可以完成文件下載,百分比進度返回等等。

/**************************************************作者: DS小龍哥功能: 執(zhí)行命令參數(shù)解釋:CallBackFunction_p func_p  :回調(diào)函數(shù),用于通知進度執(zhí)行過程char *text  //進度的轉(zhuǎn)碼過程,詳細描述.描述當前這個操作是做什么.char *total_time   //執(zhí)行的總時間char *cmd //執(zhí)行的命令**************************************************/int file_down_func(CallBackFunction_p func_p, const char *text, const char *total_time, const  char *cmd){		BOOL run_pipe;		PROCESS_INFORMATION pi;		STARTUPINFO si;		BOOL ret = FALSE;		DWORD flags = CREATE_NO_WINDOW;		char pBuffer[210];		SECURITY_ATTRIBUTES sa;		sa.nLength = sizeof(SECURITY_ATTRIBUTES);		sa.lpSecurityDescriptor = NULL;		sa.bInheritHandle = TRUE;		HANDLE hReadPipe, hWritePipe;		run_pipe = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);		if (run_pipe != 1)		{			printf("創(chuàng)建匿名管道文件失敗=%d\n", run_pipe);			return -1;		}		ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));		ZeroMemory(&si, sizeof(STARTUPINFO));		si.cb = sizeof(STARTUPINFO);		si.dwFlags |= STARTF_USESTDHANDLES;		si.hStdInput = NULL;		si.hStdError = hWritePipe;		si.hStdOutput = hWritePipe;		wchar_t cmd_wchar[1024];		CharToWchar(cmd, cmd_wchar);		//TCHAR cmd[] = TEXT("ffmpeg -i D:\\123.mp4 -vf reverse D:\\out\\out1.mp4");		ret = CreateProcess(NULL, cmd_wchar, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);		if (ret)		{			while (true)			{				DWORD ExitCode = 0;				//判斷進程是否執(zhí)行結(jié)束				printf("正在執(zhí)行...GetExitCodeProcess\r\n");				GetExitCodeProcess(pi.hProcess, &ExitCode);				printf("ExitCode:%d\r\n", ExitCode);				if (ExitCode == STILL_ACTIVE) //正在運行				{					DWORD RSize = 0;					BOOL run_s = 0;					printf("正在執(zhí)行...ReadFile\r\n");					run_s = ReadFile(hReadPipe, pBuffer, sizeof(pBuffer), &RSize, NULL);					pBuffer[RSize - 1] = '\0';					printf("執(zhí)行過程:%s,%d,%d,%s\n", version_str, run_s, RSize, pBuffer);					char number_buff[10]="\0"; //存放百分比					printf("pBuffer=%s\r\n", pBuffer);					//通過回調(diào)函數(shù)向外部返回進度提示					for (size_t i = 0; i < 10 && pBuffer[i]!='\0'; i++)					{						if (pBuffer[i] >= '0' && pBuffer[i] <= '9')						{							//得到百分比值							for (size_t j = 0; j < 9 && pBuffer[i+j] != '\0'; j++)							{								//printf("@@%c@@\r\n", pBuffer[i + j]);								if (pBuffer[i+j] >= '0' && pBuffer[i+j] <= '9')								{									number_buff[j] = pBuffer[i + j];								}								else								{									number_buff[j] = '\0';									break;								}							}							break;						}					}					//  0  926M    0 6463k    0     0  7378k      0  0:02:08 --:--:--  0:02:08 7386					//如果找到進度的位置					if (strlen(number_buff)>0)					{						std::string  out_str;						out_str = text;						out_str += ",";						out_str += "100";						out_str += ",";						out_str += number_buff;						printf("回調(diào):%s\r\n", out_str.c_str());						//將執(zhí)行的結(jié)果再回調(diào)出去						if (func_p)						{							func_p(out_str.c_str());						}					}				}				else //結(jié)束				{					printf("執(zhí)行完畢,ExitCode=%d\r\n", ExitCode);					break;				}			}			printf("正在等待子進程結(jié)束....\n");			//等待結(jié)束			WaitForSingleObject(pi.hProcess, INFINITE);			CloseHandle(pi.hProcess);			CloseHandle(pi.hThread);			printf("子進程執(zhí)行完畢....\n");			return 0;		}		printf("子進程創(chuàng)建失敗:%d\n", ret);	return -1;}int main(){    	string VideoCacheFilePath = "D:\\out";	//下載的文件名稱	string file_path = "http://192.168.1.110:8001/Uploads/1/哈哈哈.MP4";	//如果返回為真就表示是網(wǎng)絡(luò)地址	if (strstr(file_path.c_str(), "http:") ||		strstr(file_path.c_str(), "https:"))	{		//1.獲取不帶路徑的文件名		string::size_type iPos;		if (strstr(file_path.c_str(), "\"))		{			iPos = file_path.find_last_of('\\') + 1;		}		else		{			iPos = file_path.find_last_of('/') + 1;		}		//得到文件名稱		string base_file = file_path.substr(iPos, file_path.length() - iPos);		//得到完整的文件下載存儲路徑		string VideoPath_tmp = VideoCacheFilePath;		VideoPath_tmp += "\";		VideoPath_tmp += base_file;		//判斷文件是否存在		printf("文件存儲路徑:%s\r\n", VideoPath_tmp.c_str());		FILE *file_p = fopen(VideoPath_tmp.c_str(),"rb");		//不存在就下載		if (file_p == nullptr)		{			//切換目錄,進入到curl命令所在的目錄			_chdir(VideoCacheFilePath.c_str());			string cmd = "curl -O ";			cmd += file_path;			//啟動下載文件			file_down_func(NULL, base_file.c_str(),"100",cmd.c_str());		}		else		{			printf("文件存在不需要下載.\r\n");			fclose(file_p);		}	}	return 0;}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137703
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    511

    瀏覽量

    31518
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    15477
  • Curl
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    8204
收藏 人收藏

    評論

    相關(guān)推薦

    curl wget bond:深入解析命令行工具的差異與應(yīng)用場景

    下載文件curl -O http://example.com/file.zip 保存文件到指定名稱: curl -o myfile.z
    的頭像 發(fā)表于 01-24 09:20 ?73次閱讀

    EE-62:在C語言訪問短字內(nèi)存

    電子發(fā)燒友網(wǎng)站提供《EE-62:在C語言訪問短字內(nèi)存.pdf》資料免費下載
    發(fā)表于 01-07 14:02 ?0次下載
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>語言</b>中<b class='flag-5'>訪問</b>短字內(nèi)存

    如何使用 cURL 測試 HTTP 協(xié)議

    。以下是如何使用cURL測試HTTP協(xié)議的詳細步驟和示例。 1. 安裝cURL 在大多數(shù)Linux發(fā)行版和MacOS中,cURL已經(jīng)預(yù)裝。如果你使用的是
    的頭像 發(fā)表于 12-30 09:26 ?247次閱讀

    ADS8556換成.jic下載文件發(fā)現(xiàn)數(shù)據(jù)異常,為什么?

    的FPGA控制,因此又利用了SigalTap II 下載了.sof文件發(fā)現(xiàn)數(shù)據(jù)正常;但是換成.jic下載文件發(fā)現(xiàn)數(shù)據(jù)異常,只能出現(xiàn)A組通道數(shù)據(jù),B、C通道數(shù)據(jù)重復(fù)了A組通道數(shù)據(jù)
    發(fā)表于 12-20 06:53

    通過瀏覽器訪問文件——P2Link內(nèi)置HTTP服務(wù)

    P2Link可快速為本地文件目錄提供公網(wǎng)HTTP服務(wù)地址,用于遠程瀏覽和下載本地文件,類似于nginx等服務(wù)器軟件的靜態(tài)資源功能。 通過HTTP
    的頭像 發(fā)表于 11-14 10:03 ?407次閱讀
    通過瀏覽器<b class='flag-5'>訪問</b><b class='flag-5'>文件</b>——P2Link內(nèi)置<b class='flag-5'>HTTP</b>服務(wù)

    hex文件如何查看原c語言代碼

    直接將 .hex 文件轉(zhuǎn)換回原始的 C 語言代碼是不可能的,因為 .hex 文件是二進制文件,它包含了單片機程序編譯后的機器碼,這些機器碼與
    的頭像 發(fā)表于 09-02 10:37 ?2779次閱讀

    linux開發(fā)板如何編譯curl

    在Linux開發(fā)板上編譯 curl 通常涉及到幾個步驟,包括準備開發(fā)環(huán)境、下載源代碼、配置編譯選項以及執(zhí)行編譯和安裝過程。以下是一個基本的指南,幫助你在Linux開發(fā)板上編譯 curl
    的頭像 發(fā)表于 08-30 15:33 ?789次閱讀

    將電腦打造成私人網(wǎng)盤,支持外網(wǎng)訪問之詳細操作教程

    成私人網(wǎng)盤,可以實現(xiàn)在任何網(wǎng)絡(luò)環(huán)境隨時隨地訪問自己電腦上的文件。 一、安裝和設(shè)置Everything 下載Everything 訪問Eve
    的頭像 發(fā)表于 08-09 11:20 ?487次閱讀
    將電腦打造成私人網(wǎng)盤,支持外網(wǎng)<b class='flag-5'>訪問</b>之詳細操作教程

    安裝ESP8266 SDK,SDK下載文件中的.ova文件損壞如何解決?

    我正在嘗試安裝 ESP8266 SDK,按照 ESP8266-SDK__getting_started_guide.pdf 中的說明,每次我下載http
    發(fā)表于 07-10 06:01

    請問如何將cURL添加到ESP8266_RTOS_SDK項目中?

    我想使用 curl api,但我不知道如何將添加到我的項目中,這樣當我將該的頭文件包含在我的項目中時它就不會抱怨。 有誰知道如何正確地將第三方
    發(fā)表于 07-09 07:52

    docs.espressif.com訪問不穩(wěn)定的原因有哪些?

    最近2周,文檔服務(wù)器訪問不穩(wěn)定:偶爾可以訪問,大多數(shù)時候不能訪問。 以下是我從阿里云服務(wù)器上curl的信息: ----- # curl ht
    發(fā)表于 06-13 08:25

    鴻蒙開發(fā)文件管理:【@ohos.fileManager (公共文件訪問與管理)】

    該模塊提供公共文件訪問和管理的服務(wù)接口,向下對接底層文件管理服務(wù),如媒體、外卡管理;向上對應(yīng)用程序提供公共文件查詢、創(chuàng)建的能力。
    的頭像 發(fā)表于 06-12 17:00 ?1021次閱讀
    鴻蒙開發(fā)<b class='flag-5'>文件</b>管理:【@ohos.fileManager (公共<b class='flag-5'>文件</b><b class='flag-5'>訪問</b>與管理)】

    遠程下載是什么意思?怎么實現(xiàn)遠程下載文件

    附屬存儲)、電腦或其他支持遠程下載的設(shè)備來下載文件。這樣,用戶不必親自在存儲設(shè)備旁等待文件下載完成,提高了靈活性和便利性。
    的頭像 發(fā)表于 05-15 11:39 ?909次閱讀

    請問STVD+Cosmic有沒有自己的C語言

    我自己安裝的STVD+Cosmic,找不到自己的C語言,好多函數(shù)都不能調(diào)用,從網(wǎng)上下載調(diào)用的時候會報很多錯誤,
    發(fā)表于 05-14 06:30

    深入分析一MDK的分散加載文件

    ARM C 提供了函數(shù) __user_setup_stackheap() 的多個實現(xiàn),并且可以根據(jù)分散文件中提供的信息自動選擇正確的一種。
    發(fā)表于 04-28 14:21 ?912次閱讀
    深入分析一<b class='flag-5'>下</b>MDK的分散加<b class='flag-5'>載文件</b>
    百家乐强弱走势图| 百家乐官网平的概率| 网上百家乐有人赢过嘛| 网页百家乐官网| 百家乐大路图| 赌博百家乐官网秘笈| 大发888注册奖金| 联合百家乐官网的玩法技巧和规则| 大发888娱乐城出纳柜台| 百家乐官网赌博工具| 大发888电话| 百家乐视频美女| 百家乐官网冯耕耘打法| 玩百家乐去哪个娱乐城最安全 | 大发888下载 34| 百家乐娱乐城玩法| 百家乐官网网页游戏网址| 大发888开户博盈国际| 百家乐最长的缆| 网上赌百家乐官网正规吗| 大发888娱乐场下载 df888ylc3403| 百家乐网上赌博| 百家乐官网注册送免费金| 大发888下载失败| 百家乐一直下注庄家| 百家乐官网赌博机销售| 百家乐太阳城| 百家乐大天堂| 百家乐官网技巧经| 百家乐官网在线投注系统| 德州扑克比赛视频| 大发888娱乐城好吗| 百家乐好赌吗| 中国百家乐官网的玩法技巧和规则| 固原市| 百家乐作| 百家乐游戏试玩免费| 百家乐官网游戏源码手机| 文安县| 大发888亚洲城娱乐城| 闲和庄百家乐娱乐场|