libcurl之ftp上传 & 下载

    由于项目的需要,利用libcurl编写程序与ftp服务器通信,进行文件上传或下载,愈发地感到curl功能的强悍。其实在命令行下直接使用curl命令就可以完成这些功能,但是需要获取上传下载行为的状态以便更好地控制。直接上代码:

//ftp-manager.h

#ifndef _FTP_MANAGER_H_
#define _FTP_MANAGER_H_

/*FTP OPERATION CODE*/
typedef enum FTP_STATE
{
	FTP_UPLOAD_SUCCESS,
	FTP_UPLOAD_FAILED,
	FTP_DOWNLOAD_SUCCESS,
	FTP_DOWNLOAD_FAILED 
}FTP_STATE;

/*FTP OPERATIONS OPTIONS*/
typedef struct FTP_OPT
{
	char *url;		/*url of ftp*/
	char *user_key;		/*username:password*/
	char *file;		/*filepath*/
}FTP_OPT;

#ifdef __cplusplus
	extern "C" {
#endif

/*upload file to ftp server*/
FTP_STATE ftp_upload(const FTP_OPT ftp_option);

/*download file from ftp server*/
FTP_STATE ftp_download(const FTP_OPT ftp_option);

#ifdef __cplusplus
	}
#endif

#endif

//ftp-manager.c

#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>

#include "ftp-manager.h"

/*****************util api******************/
int get_file_size(FILE *file)
{
	int size = 0;
	fseek(file, 0L, SEEK_END);
	size = ftell(file);
	fseek(file, 0L, SEEK_SET);
	return size;
}

/******************curl api****************/
CURL *curl_init()
{
	curl_global_init(CURL_GLOBAL_DEFAULT); 
	CURL *curl = curl_easy_init();
	if(NULL == curl)
	{
		fprintf(stderr, "Init curl failed.\n");
		exit(1);
	}
	return curl;
}

void curl_set_upload_opt(CURL *curl, const char *url, const char *user_key, FILE *file)
{
	curl_easy_setopt(curl, CURLOPT_URL, url);
	curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
	curl_easy_setopt(curl, CURLOPT_READDATA, file);	
	curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
	curl_easy_setopt(curl, CURLOPT_INFILESIZE, get_file_size(file));
	curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
//	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
}

void curl_set_download_opt(CURL *curl, const char *url, const char *user_key, FILE *file)
{
	curl_easy_setopt(curl, CURLOPT_URL, url);
	curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
//	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
}

void curl_exit(CURL *curl)
{
	curl_easy_cleanup(curl);
	curl_global_cleanup(); 
}

CURLcode curl_perform(CURL *curl)
{
	CURLcode ret = curl_easy_perform(curl);
	if(ret != 0)
	{
		fprintf(stderr, "Perform curl failed.\n");
		curl_exit(curl);
		exit(1);
	}
	return ret;
}

/****************ftp upload & download api******************/
FTP_STATE ftp_upload(const FTP_OPT ftp_option)
{
	FTP_STATE state;
	CURL *curl;;
	FILE *fp = fopen(ftp_option.file, "r");
	if(NULL == fp)
	{
		fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
		return FTP_UPLOAD_FAILED;
	}

	curl = curl_init();
	curl_set_upload_opt(curl, ftp_option.url, ftp_option.user_key, fp);
	if(CURLE_OK == curl_perform(curl))
		state = FTP_UPLOAD_SUCCESS;
	else
		state = FTP_UPLOAD_FAILED;

	curl_exit(curl);
	fclose(fp);
	return state;
}

FTP_STATE ftp_download(const FTP_OPT ftp_option)
{
	FTP_STATE state;
	CURL *curl;
	FILE *fp = fopen(ftp_option.file, "w");
	if(NULL == fp)
	{
		fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
		return FTP_UPLOAD_FAILED;
	}

	curl = curl_init();
	curl_set_download_opt(curl, ftp_option.url, ftp_option.user_key, fp);
	if(CURLE_OK == curl_perform(curl))
		state = FTP_DOWNLOAD_SUCCESS;
	else
		state = FTP_DOWNLOAD_FAILED;

	curl_exit(curl);
	fclose(fp);
	return state;
}

//test.c

#include <stdio.h>

#include "ftp-manager.h"

int main()
{
	FTP_OPT ftp_opt;
	ftp_opt.url = "ftp://127.0.0.1//var/ftp/upload.txt";
	ftp_opt.user_key = "xxx:xxx";
	ftp_opt.file = "/home/xxx/project/ftpManager/upload.txt";

	if(FTP_UPLOAD_SUCCESS == ftp_upload(ftp_opt))
		printf("Upload success.\n");
	else
		printf("Upload failed.\n");

	ftp_opt.url = "ftp://127.0.0.1//var/ftp/download.txt";
	ftp_opt.file = "/home/xxx/project/ftpManager/download.txt";

	if(FTP_DOWNLOAD_SUCCESS == ftp_download(ftp_opt))
		printf("Download success.\n");
	else
		printf("Download failed.\n");

	return 0;
}

转载于:https://my.oschina.net/pathenon/blog/66154

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: libcurl是一个开源的网络传输库,它支持多种协议,包括FTP。使用libcurl可以方便地实现FTP文件上传下载等操作。它提供了丰富的API,可以轻松地在C/C++等编程语言中使用。同时,libcurl还支持多线程和SSL加密等功能,使得网络传输更加安全和高效。 ### 回答2: libcurl是一个开源的网络传输库,它提供了ftp的客户端实现,使我们可以使用ftp传输协议上传下载文件。libcurl ftp支持多种ftp协议以及不同的认证方式,例如匿名登录、用户名密码认证等。 libcurl ftp的使用非常简单,只需要使用curl_easy_setopt()函数设置相关选项,然后使用curl_easy_perform()函数执行上传下载操作即可。例如,使用ftp协议上传文件到ftp服务器,我们需要设置以下选项: 1. CURLOPT_UPLOAD:表示启用上传模式; 2. CURLOPT_URL:指定ftp服务器的地址; 3. CURLOPT_USERPWD:指定用户名密码,如果服务器不需要认证可以设置为空; 4. CURLOPT_READDATA:设置上传的数据流; 5. CURLOPT_INFILESIZE_LARGE:设置上传文件的大小。 执行上传操作后,libcurl ftp会自动连接到ftp服务器并上传指定的文件。类似地,libcurl ftp也支持下载文件,只需要设置下载的选项即可。 除了上传下载文件外,libcurl ftp还支持列出远程目录、创建新目录、删除文件和目录等操作。我们可以通过设置不同的选项来达到不同的操作目的。 总的来说,libcurl ftp是一个非常实用的ftp客户端实现,它提供了丰富的功能和灵活的选项,可以方便地完成常见的ftp文件传输任务。无论是开发者还是普通用户,都可以通过libcurl ftp快速高效地进行ftp文件传输。 ### 回答3: libcurl是一个用C编写的自由开源工具库,它支持大量的网络协议和数据传输方式,包括HTTP/HTTPS、FTP、TELNET、SMTP、POP3、IMAP等常见协议。而对于FTP传输方式来说,libcurl也提供了很好的支持,使得开发人员可以方便地使用FTP进行文件传输和操作。 在使用libcurl进行FTP操作时,通常需要先通过curl_easy_init()函数来初始化一个curl_easy_handle对象。然后通过设置相关选项参数,如ftp服务器地址、用户名密码、端口等,来建立FTP连接。建立连接之后,可以调用curl_easy_setopt()函数来设置不同的选项参数,如CURLOPT_URL来设置FTP的路径,CURLOPT_UPLOAD来设置上传文件,CURLOPT_RESUME_FROM来设置断点续传等。之后通过调用curl_easy_perform()函数来执行相关操作。 需要注意的是,在进行FTP操作时,需要先调用login命令进行登录,并通过cwd命令设置工作目录。同时,需要遵守FTP协议的相关规定,如传输完成之后需要使用quit命令关闭FTP连接等。 总之,libcurl提供了很好的FTP支持,使得开发人员可以方便地使用FTP进行文件传输和操作,而且其跨平台的特性也方便了不同系统之间的FTP交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值