0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

windows下C语言使用curl库访问HTTP下载文件

DS小龙哥-嵌入式技术 2022-09-17 15:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

【摘要】 cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。

一、前言

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。

cURL支持的通信协议有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

解压后的可执行文件位置:

image-20220513134530563

下面是解压后的文件目录:

image-20220513134631915

在命令行使用curl测试下载文件:

image-20220513134729784

三、通过命令行使用curl

curl可以直接调用函数库完成功能设计、也可以直接调用可执行文件完成需要的功能,下面这里就介绍,在windows下,通过CreateProcess调用curl命令函数完成文件下载。使用curl实现HTTP协议文件下载成功,通过给定的连接地址,可以完成文件下载,百分比进度返回等等。

/**************************************************作者: DS小龙哥功能: 执行命令参数解释:CallBackFunction_p func_p  :回调函数,用于通知进度执行过程char *text  //进度的转码过程,详细描述.描述当前这个操作是做什么.char *total_time   //执行的总时间char *cmd //执行的命令**************************************************/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("创建匿名管道文件失败=%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;				//判断进程是否执行结束				printf("正在执行...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("正在执行...ReadFile\r\n");					run_s = ReadFile(hReadPipe, pBuffer, sizeof(pBuffer), &RSize, NULL);					pBuffer[RSize - 1] = '\0';					printf("执行过程:%s,%d,%d,%s\n", version_str, run_s, RSize, pBuffer);					char number_buff[10]="\0"; //存放百分比					printf("pBuffer=%s\r\n", pBuffer);					//通过回调函数向外部返回进度提示					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("回调:%s\r\n", out_str.c_str());						//将执行的结果再回调出去						if (func_p)						{							func_p(out_str.c_str());						}					}				}				else //结束				{					printf("执行完毕,ExitCode=%d\r\n", ExitCode);					break;				}			}			printf("正在等待子进程结束....\n");			//等待结束			WaitForSingleObject(pi.hProcess, INFINITE);			CloseHandle(pi.hProcess);			CloseHandle(pi.hThread);			printf("子进程执行完毕....\n");			return 0;		}		printf("子进程创建失败:%d\n", ret);	return -1;}int main(){    	string VideoCacheFilePath = "D:\\out";	//下载的文件名称	string file_path = "http://192.168.1.110:8001/Uploads/1/哈哈哈.MP4";	//如果返回为真就表示是网络地址	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;}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144653
  • HTTP
    +关注

    关注

    0

    文章

    531

    浏览量

    34864
  • URL
    URL
    +关注

    关注

    0

    文章

    141

    浏览量

    16111
  • Curl
    +关注

    关注

    0

    文章

    17

    浏览量

    8568
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    windows环境如何生成bitstream文件

    system.org我明白这个是E203的顶层文件,但是不知道在windows环境这个文件该怎么使用
    发表于 11-06 06:18

    YModem下载文件到U盘失败,文件0字节,是哪里的问题?

    failed. 2)通过Ymodem往U盘下载文件失败,(正常结束,U盘文件长度0字节,然后访问U盘报错 [E/usbh_msc] cbw transfer error usb mass_storage
    发表于 10-11 10:39

    HTTP开发必备:核心与httpplus扩展应用示例全攻略

    HTTP开发的必备参考!本文汇总核心基础操作与httpplus扩展高级特性,通过示例解析,让你快速上手各类HTTP开发需求。
    的头像 发表于 09-20 15:19 3044次阅读
    <b class='flag-5'>HTTP</b>开发必备:核心<b class='flag-5'>库</b>与httpplus扩展<b class='flag-5'>库</b>应用示例全攻略

    【HZ-T536开发板免费体验】3 - Cangjie Magic调用视觉语言大模型(VLM)真香,是不是可以没有YOLO和OCR了?

    ,但是交叉编译所需要的aarch64版本还需要手工下载访问stdx的主页,点击右侧的“发行版”,找到最新的版本,在其中现在aarch64的文件(例如
    发表于 08-01 22:15

    数据数据恢复—MongoDB数据库文件丢失的数据恢复案例

    MongoDB数据数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据。 MongoDB数据故障: 工作人员在MongoDB服务仍
    的头像 发表于 07-01 11:13 476次阅读
    数据<b class='flag-5'>库</b>数据恢复—MongoDB数据<b class='flag-5'>库文件</b>丢失的数据恢复案例

    Windows环境32位汇编语言中文资料

    电子发烧友网站提供《Windows环境32位汇编语言中文资料.rar》资料免费下载
    发表于 06-30 15:14 0次下载

    提高篇——C语言核心技术(中文版)

    严谨的术语表介绍C语言;第二部分描述标准链接;第三部分介绍GNU软件包中常用的编译和测试工具。 获取完整文档资料可下载附件哦!!!!如果内容有帮助可以关注、点赞、评论支持一
    发表于 06-13 16:39

    数据数据恢复——MongoDB数据库文件拷贝后服务无法启动的数据恢复

    MongoDB数据数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据。 MongoDB数据故障: 管理员在未关闭MongoDB服务的
    的头像 发表于 04-09 11:34 666次阅读
    数据<b class='flag-5'>库</b>数据恢复——MongoDB数据<b class='flag-5'>库文件</b>拷贝后服务无法启动的数据恢复

    SQLite数据访问组件

    SQLite 数据访问组件 SQLite 数据访问组件 (LiteDAC) 是一个组件 它提供从 Delphi 和 C++ Builder 到 SQLite 的原生连接,包括 Com
    的头像 发表于 02-08 11:48 847次阅读
    SQLite数据<b class='flag-5'>访问</b>组件

    curl wget bond:深入解析命令行工具的差异与应用场景

    下载文件curl -O http://example.com/file.zip 保存文件到指定名称: curl -o myfile.z
    的头像 发表于 01-24 09:20 780次阅读

    从Delphi、C++ Builder和Lazarus连接到MySQL数据

      从 Delphi、C++ Builder 和 Lazarus 连接到 MySQL 数据 MySQL 数据访问组件(MyDAC)是一个组件,提供从 Delphi 和
    的头像 发表于 01-20 13:47 1338次阅读
    从Delphi、<b class='flag-5'>C</b>++ Builder和Lazarus连接到MySQL数据<b class='flag-5'>库</b>

    EE-62:在C语言访问短字内存

    电子发烧友网站提供《EE-62:在C语言访问短字内存.pdf》资料免费下载
    发表于 01-07 14:02 0次下载
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>语言</b>中<b class='flag-5'>访问</b>短字内存

    AKI跨语言调用神助攻C/C++代码迁移至HarmonyOS NEXT

    语言调用,成为开发者和厂商面临的重要挑战。为解决这一痛点,一款名为AKI (Alpha Kernel Interacting)的开源三方应运而生,它通过高效封装跨语言调用接口,帮助开发者将
    发表于 01-02 17:08

    如何使用 cURL 测试 HTTP 协议

    。以下是如何使用cURL测试HTTP协议的详细步骤和示例。 1. 安装cURL 在大多数Linux发行版和MacOS中,cURL已经预装。如果你使用的是
    的头像 发表于 12-30 09:26 2117次阅读

    ADS8556换成.jic下载文件发现数据异常,为什么?

    的FPGA控制,因此又利用了SigalTap II 下载了.sof文件发现数据正常;但是换成.jic下载文件发现数据异常,只能出现A组通道数据,B、C通道数据重复了A组通道数据
    发表于 12-20 06:53