91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

windows下C語(yǔ)言使用curl庫(kù)訪問(wèn)HTTP下載文件

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

一、前言

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

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

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

二、curl下載

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

下載頁(yè)面如圖:

image-20220513134431494image-20220513134501163

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

image-20220513134530563

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

image-20220513134631915

在命令行使用curl測(cè)試下載文件:

image-20220513134729784

三、通過(guò)命令行使用curl

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

/**************************************************作者: DS小龍哥功能: 執(zhí)行命令參數(shù)解釋:CallBackFunction_p func_p  :回調(diào)函數(shù),用于通知進(jìn)度執(zhí)行過(guò)程char *text  //進(jìn)度的轉(zhuǎn)碼過(guò)程,詳細(xì)描述.描述當(dāng)前這個(gè)操作是做什么.char *total_time   //執(zhí)行的總時(shí)間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;				//判斷進(jìn)程是否執(zhí)行結(jié)束				printf("正在執(zhí)行...GetExitCodeProcess\r\n");				GetExitCodeProcess(pi.hProcess, &ExitCode);				printf("ExitCode:%d\r\n", ExitCode);				if (ExitCode == STILL_ACTIVE) //正在運(yùn)行				{					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í)行過(guò)程:%s,%d,%d,%s\n", version_str, run_s, RSize, pBuffer);					char number_buff[10]="\0"; //存放百分比					printf("pBuffer=%s\r\n", pBuffer);					//通過(guò)回調(diào)函數(shù)向外部返回進(jìn)度提示					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					//如果找到進(jìn)度的位置					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("正在等待子進(jìn)程結(jié)束....\n");			//等待結(jié)束			WaitForSingleObject(pi.hProcess, INFINITE);			CloseHandle(pi.hProcess);			CloseHandle(pi.hThread);			printf("子進(jìn)程執(zhí)行完畢....\n");			return 0;		}		printf("子進(jìn)程創(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);		//得到完整的文件下載存儲(chǔ)路徑		string VideoPath_tmp = VideoCacheFilePath;		VideoPath_tmp += "\";		VideoPath_tmp += base_file;		//判斷文件是否存在		printf("文件存儲(chǔ)路徑:%s\r\n", VideoPath_tmp.c_str());		FILE *file_p = fopen(VideoPath_tmp.c_str(),"rb");		//不存在就下載		if (file_p == nullptr)		{			//切換目錄,進(jìn)入到curl命令所在的目錄			_chdir(VideoCacheFilePath.c_str());			string cmd = "curl -O ";			cmd += file_path;			//啟動(dòng)下載文件			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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145615
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    537

    瀏覽量

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

    關(guān)注

    0

    文章

    142

    瀏覽量

    16227
  • Curl
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    8636
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    curl中的TFTP實(shí)現(xiàn):整數(shù)溢導(dǎo)致堆內(nèi)存越界讀取漏洞

    各部分長(zhǎng)度相加后再與緩沖區(qū)大小進(jìn)行比較,從根本上杜絕了整數(shù)溢的可能性。同時(shí),sbytes 的計(jì)算也改為基于 curl_msnprintf 的實(shí)際返回值,更加準(zhǔn)確和安全。FINISHED biOK/hzhVF2yKaGc5mK8oeejIYuUYW8I3RsXQCFCiX
    發(fā)表于 02-19 13:55

    請(qǐng)問(wèn)如何實(shí)現(xiàn)C語(yǔ)言訪問(wèn)MCU寄存器?

    單片機(jī)的特殊功能寄存器SFR,是SRAM地址已經(jīng)確定的SRAM單元,在C語(yǔ)言環(huán)境對(duì)其訪問(wèn)歸納起來(lái)有兩種方法。 采用標(biāo)準(zhǔn)C的強(qiáng)制類型轉(zhuǎn)換和指
    發(fā)表于 12-26 07:00

    C語(yǔ)言特性

    1、高效性:直接操作硬件 C 語(yǔ)言代碼的執(zhí)行效率極高,這是其最為顯著的優(yōu)勢(shì)之一。它能夠直接訪問(wèn)硬件資源,與底層硬件進(jìn)行緊密交互,充分發(fā)揮硬件的性能潛力。在嵌入式開(kāi)發(fā)中,硬件資源往往十分有限,對(duì)程序
    發(fā)表于 11-24 07:01

    C語(yǔ)言和單片機(jī)C語(yǔ)言有什么差異

    匯編語(yǔ)言機(jī)器才能讀懂,所以每個(gè)平臺(tái)的編譯器編譯成對(duì)應(yīng)平臺(tái)匯編的程序,每個(gè)平臺(tái)的匯編不一樣,當(dāng)然編譯器也不一樣。 DOS上的TC2 TC3 WINDOWS上的VC 8051的C51都有自已的編譯器。具體
    發(fā)表于 11-14 07:55

    windows環(huán)境如何生成bitstream文件?

    system.org我明白這個(gè)是E203的頂層文件,但是不知道在windows環(huán)境這個(gè)文件該怎么使用
    發(fā)表于 11-06 06:18

    YModem下載文件到U盤失敗,文件0字節(jié),是哪里的問(wèn)題?

    failed. 2)通過(guò)Ymodem往U盤下載文件失敗,(正常結(jié)束,U盤文件長(zhǎng)度0字節(jié),然后訪問(wèn)U盤報(bào)錯(cuò) [E/usbh_msc] cbw transfer error usb mass_storage
    發(fā)表于 10-11 10:39

    HTTP開(kāi)發(fā)必備:核心庫(kù)與httpplus擴(kuò)展庫(kù)應(yīng)用示例全攻略

    HTTP開(kāi)發(fā)的必備參考!本文匯總核心庫(kù)基礎(chǔ)操作與httpplus擴(kuò)展庫(kù)高級(jí)特性,通過(guò)示例解析,讓你快速上手各類HTTP開(kāi)發(fā)需求。
    的頭像 發(fā)表于 09-20 15:19 ?3200次閱讀
    <b class='flag-5'>HTTP</b>開(kāi)發(fā)必備:核心<b class='flag-5'>庫(kù)</b>與httpplus擴(kuò)展<b class='flag-5'>庫(kù)</b>應(yīng)用示例全攻略

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】3 - Cangjie Magic調(diào)用視覺(jué)語(yǔ)言大模型(VLM)真香,是不是可以沒(méi)有YOLO和OCR了?

    ,但是交叉編譯所需要的aarch64版本還需要手工下載。 訪問(wèn)stdx庫(kù)的主頁(yè),點(diǎn)擊右側(cè)的“發(fā)行版”,找到最新的版本,在其中現(xiàn)在aarch64的文件(例如
    發(fā)表于 08-01 22:15

    數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—MongoDB數(shù)據(jù)庫(kù)文件丟失的數(shù)據(jù)恢復(fù)案例

    MongoDB數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)環(huán)境: 一臺(tái)操作系統(tǒng)為Windows Server的虛擬機(jī)上部署MongoDB數(shù)據(jù)庫(kù)。 MongoDB數(shù)據(jù)庫(kù)故障: 工作人員在MongoDB服務(wù)仍
    的頭像 發(fā)表于 07-01 11:13 ?643次閱讀
    數(shù)據(jù)<b class='flag-5'>庫(kù)</b>數(shù)據(jù)恢復(fù)—MongoDB數(shù)據(jù)<b class='flag-5'>庫(kù)文件</b>丟失的數(shù)據(jù)恢復(fù)案例

    Windows環(huán)境32位匯編語(yǔ)言中文資料

    電子發(fā)燒友網(wǎng)站提供《Windows環(huán)境32位匯編語(yǔ)言中文資料.rar》資料免費(fèi)下載
    發(fā)表于 06-30 15:14 ?0次下載

    提高篇——C語(yǔ)言核心技術(shù)(中文版)

    嚴(yán)謹(jǐn)?shù)男g(shù)語(yǔ)表介紹C語(yǔ)言;第二部分描述標(biāo)準(zhǔn)鏈接庫(kù);第三部分介紹GNU軟件包中常用的編譯和測(cè)試工具。 獲取完整文檔資料可下載附件哦?。。?!如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一
    發(fā)表于 06-13 16:39

    3D AD庫(kù)文件

    3D庫(kù)文件
    發(fā)表于 05-28 13:57 ?6次下載

    PCB標(biāo)準(zhǔn)封裝庫(kù)文件

    PCB標(biāo)準(zhǔn)封裝庫(kù)文件
    發(fā)表于 05-22 17:43 ?10次下載

    C語(yǔ)言的歷史及程序介紹

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言的歷史及程序介紹.pdf》資料免費(fèi)下載
    發(fā)表于 04-09 16:10 ?0次下載

    數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)——MongoDB數(shù)據(jù)庫(kù)文件拷貝后服務(wù)無(wú)法啟動(dòng)的數(shù)據(jù)恢復(fù)

    MongoDB數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)環(huán)境: 一臺(tái)Windows Server操作系統(tǒng)虛擬機(jī)上部署MongoDB數(shù)據(jù)庫(kù)。 MongoDB數(shù)據(jù)庫(kù)故障: 管理員在未關(guān)閉MongoDB服務(wù)的
    的頭像 發(fā)表于 04-09 11:34 ?868次閱讀
    數(shù)據(jù)<b class='flag-5'>庫(kù)</b>數(shù)據(jù)恢復(fù)——MongoDB數(shù)據(jù)<b class='flag-5'>庫(kù)文件</b>拷貝后服務(wù)無(wú)法啟動(dòng)的數(shù)據(jù)恢復(fù)