【摘要】 cURL是一個(gè)利用URL語(yǔ)法在命令行下工作的文件傳輸工具,1997年首次發(fā)行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統(tǒng),習(xí)慣稱cURL為下載工具。cURL還包含了用于程序開發(fā)的libcurl。
一、前言
cURL是一個(gè)利用URL語(yǔ)法在命令行下工作的文件傳輸工具,1997年首次發(fā)行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統(tǒng),習(xí)慣稱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認(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è)面如圖:
解壓后的可執(zhí)行文件位置:
下面是解壓后的文件目錄:
在命令行使用curl測(cè)試下載文件:
三、通過(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;}
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136683 -
HTTP
+關(guān)注
關(guān)注
0文章
504瀏覽量
31194 -
URL
+關(guān)注
關(guān)注
0文章
139瀏覽量
15328 -
Curl
+關(guān)注
關(guān)注
0文章
15瀏覽量
8176
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論