使用libcurl操作ftp

本文详细介绍了如何使用libcurl库进行FTP操作,包括上传文件、自动创建目录、FTP命令的使用如MKD、CWD、RMD等。还讨论了CURLOPT_QUOTE、CURLOPT_POSTQUOTE和CURLOPT_CUSTOMREQUEST的区别,并解析了FTP的被动模式与主动模式,提供了设置主动模式的示例代码。最后给出了FTP操作的实例代码。
摘要由CSDN通过智能技术生成

       使用libcurl操作ftp存储文件、目录等,操作之前可以先登录,也可以不登录再请求添加ftp和用户密码信息,libcurl会检测没有登录的话会自动登录请求。

1、ftp上传文件,需要自动创建目录时,需要设置CURLOPT_FTP_CREATE_MISSING_DIRS属性。
ftp上传文件时,目录不存在时,设置下面的属性,可以在上传文件时,自动创建目录。
curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
也可以通过ftp命令MKD创建目录。
2、目录和文件命令
MKD:创建目录,发送创建目录命令之后,会返回CURLE_FTP_COULDNT_RETR_FILE(19,这是一个奇怪的回答“RETR”命令或一个零字节传输完成。)
CWD:切换目录
RMD: 删除目录
PWD:返回当前目录
DELE:删除文件

NLST、LIST、MLSD三个命令都可以获取FTP指定目录下的文件信息,如文件名称、文件大小、文件类型、文件最后修改时间等。
NLST:返回获取文件名。如:00008d38072c01ba00e41507ba1bcb20.mdat\r\n03258da63bccf1b387185bdd0b7afd76.mdat\r\n
LIST:返回获取文件类型、修改日期、大小、名称等信息。如:-rw-r--r-- 1 ftp ftp         154168 Jan 20 18:53 00008d38072c01ba00e41507ba1bcb20.mdat\r\n-rw-r--r-- 1 ftp ftp         154168 Feb 23 09:36 03258da63bccf1b387185bdd0b7afd76.mdat\r\n
MLSD:返回获取文件类型、修改日期、大小、名称等信息,用“;”分隔各个属性。如:type=file;modify=20180120185307;size=154168; 00008d38072c01ba00e41507ba1bcb20.mdat\r\ntype=file;modify=20180223013632;size=154168; 03258da63bccf1b387185bdd0b7afd76.mdat\r\n

CURL *curl = NULL;
curl = curl_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "MLSD");//type=file;modify=20180223013632;size=154168; 03258da63bccf1b387185bdd0b7afd76.mdat
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getFTPFileList);
curl_perform(curl);
curl_exit(curl);


3、CURLOPT_QUOTE、CURLOPT_POSTQUOTE、CURLOPT_CUSTOMREQUEST区别
CURLOPT_QUOTE,一组先于 FTP 请求的在服务器上执行的FTP命令。
CURLOPT_POSTQUOTE,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。
CURLOPT_QUOTE 和 CURLOPT_POSTQUOTE
这两个选项的功能类似,它们的共同点都是给 FTP 或 SFTP 传递命令。这些命令应该放在 struct slist 链表中存储,使用时需要用 curl_slist_append() 函数将这些命令打包起来,然后一起发送出去。
它们的不同点是:CURLOPT_QUOTE 选项要求命令要在 FTP 传输请求之前就要发送到库,而 CURLOPT_POSTQUOTE 则可以在 FTP 传输请求发送完后发送。
CURLOPT_CUSTOMREQUEST,自定义请求方式。

4、ftp上传的两种方式
FTP分为两个链路,第一个是命令链路,端口是21;第二个是数据链路,只有在上传或下载的时候才会建立,使用哪个端口就取决于客户端所采用的模式了。
1). 被动模式(PASV方式)
命令链路建立后,当有数据要传输时, 客户端在命令链路上用PASV命令告诉服务器,“我要传输数据了,给我个端口”,服务器返回一个可用的端口给客户端,客户端向这个端口发起请求,连接建立。
2). 主动模式(PORT方式)
命令链路建立后,当有数据要传输时, 客户端在命令链路上用PORT命令告诉服务器,“我打开了某某端口,过来连我啊”,于是服务器向客户端的某某端口发起连接请求,连接建立。

采用主动模式的弊端:
采用主动模式传输,主要问题在于客户端开放给服务端的数据连接端口,服务器不一定能访问到,比如如果有防火墙的话。
libcurl默认采用被动模式上传,改为主动模式需要添加一行代码:
curl_easy_setopt(curl, CURLOPT_FTPPORT, "-");

5、ftp主动模式下载:
//设置主动模式
curl_easy_setopt(curl,CURLOPT_FTPPORT,"192.168.6.174:100000-110000");
curl_easy_setopt(curl,CURLOPT_FTPPORT,"192.168.6.174:0");
这两句都是设置主动模式的语句,区别就是上面那句设定了具体的主动端口区间,在连接时只能选择100000-110000区间的空闲端口号,关于这里端口号区间的选择,本人理解是能大就大,ftp的本身占用20,21两个端口(默认情况下),21端口可以修改,因此你的端口区间可能被用作其他ftp的端口号,所以这个区间能大就大,当然了,如果没有特殊需求,可以使用下面的语句进行主动模式设置。

6、实例

//FtpOperate.h

#include <list>

//ftp目录文件信息
struct FtpDirFileInfo
{
	char szFileName[MAX_PATH];				//文件名称
	unsigned char ucIsDir;					//是否是目标
	unsigned char ucReserve[3];				//保留值
	unsigned int uiFileSize;				//文件大小
};

	/*
	功能:执行ftp命令(执行一组命令方式)(用于创建目录,删除目录等)
	参数:curl,表示curl;pUrl,表示ftp的url地址;usPort,表示ftp端口;pUsername,表示ftp登录用户名;pPassword,表示ftp登录密码;
		  pCommand,命令;bIsGetResponseData,表示是否获取返回数据;strReponse,返回数据;nConnectTimeout,连接超时时间,单位秒;nTimeout,操作等待超时时间,单位秒;
	返回值:int,0,表示成功;非0,表示错误码
	*/
	int  ExecuteFtpRequestCommandByQuote(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, char *pCommand,bool bIsGetResponseData,std::string & strReponse, int nConnectTimeout = 30, int nTimeout = 30);
	/*
	功能:执行ftp命令(自定义请求方式)
	参数:curl,表示curl;pUrl,表示ftp的url地址;usPort,表示ftp端口;pUsername,表示ftp登录用户名;pPassword,表示ftp登录密码;
	pCommand,命令;bIsGetResponseData,表示是否获取返回数据;strReponse,返回数据;nConnectTimeout,连接超时时间,单位秒;nTimeout,操作等待超时时间,单位秒;
	返回值:int,0,表示成功;非0,表示错误码
	*/
	int  ExecuteFtpRequestCommandByCustomRequest(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, char *pCommand, bool bIsGetResponseData, std::string & strReponse, int nConnectTimeout = 30, int nTimeout = 30);

	//ftp登录
	int  FtpLogin(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, std::string response);

	/*
	功能:获取指定目录的所包含文件和目录
	参数:curl,表示curl;pUrl,表示ftp的url地址;usPort,表示ftp端口;pUsername,表示ftp登录用户名;pPassword,表示ftp登录密码;
	      pPathName,表示目录,NULL时表示主目录,非NULL,指定某个目录;listFtpDirFileInfo,表示返回的目录和文件列表
	返回值:int,0,表示成功;非0,表示错误码
	*/
	int FtpGetAllDirAndFile(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, char *pPathName, std::list<FtpDirFileInfo> & listFtpDirFileInfo);

	//是否存在该目录
	bool FtpExistDir(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, char *pPathName);

	//创建目录
	int FtpCreateDir(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, char *pPathName);

	//删除目录
	int FtpDeleteDir(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, char *pPathName);

	//删除文件
	int FtpDeleteFile(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword, char *pFilePathName);

	//上传文件
	int FtpUploadFile(CURL * curl, char *pUrl, unsigned short usPort, char *pUsername, char *pPassword,char *pRomuteStoreFilePathName, FILE * fpUploadFile, int nUploadFileSize, int nConnectTimeout = 30, int nTimeout = 30);

	//下载文件
	int FtpDownloadFile(CURL * curl, char *pUrl, unsigned short usPort, char *pUser
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byxdaz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值