研究报告指出的目标是使用libcurl实现ftp文件上传和下载功能

一、Libcurlde简要

Libcurl的而且易于使用的利用url进行文件传输的库。

, libcurl当前支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP,LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP协议。libcurl相同支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传。代理。cookies,和用户认证。

Libcurl是一个轻量级的库,编译后可以执行到多种平台,包含:Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64,Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX,OpenVMS, RISC OS, Novell NetWare, DOS 等

二、libcurl的接口

Libcurl分为简单和复杂的接口。

简单的接口是一个同步的,高效的,高速的。这样的借口主要用于文件传输。

大量的应用程序都使用这样的方式。而复杂的姐姐偶是一个异步的,在这里不做过多研究

三、libcurl简单的接口工作流程

1、使用libcurl中的curl_easy_init()来初始化一个简单的文件传输会话而且获取到一个handle

2、通过使用curl_easy_setopt()来设置全部的选项參数。在这些參数中最重要的就是URL,同一时候你也极有可能须要设置一些回调函数。这些回调函数将会在条件符合的情况下被调用。

3、当上面的工作都做完了的时候。就能够使用curl_easy_perform()通知libcurl进行文件传输了。该函数在整个传输过程完毕或者失败的时候才会返回一个值。

4、当你运行了第3步之后,你能够使用curl_easy_getinfo()来获取传输的信息

5、最后,你相同能够使用curl_easy_cleanup()来结束本次文件会话

以下针对这五个步骤,编写一个实例进行測试

四、部分功能函数的介绍

1、CURL *curl_easy_init( );

该函数必须首先调用,将会返回一个CURL*类型的handle.而且该函数将会和curl_easy_cleanup()一起配合使用。增加初始化出错的话,该函数将会返回一个NULL。

2、void curl_easy_cleanup(CURL *handle)

该函数一定是最后被调用的,他的參数应该是curl_easy_init的返回值;

3、CURLcode curl_easy_setopt(CURL*handle, CURLoption option, parameter);

该函数从名字上看就知道是设置一些參数的。通过设置不同的參数,将会改变libcurl的功能作用。这个须要细致阅读指导文档,一旦设置方式不恰当,导致的错误将是致命的。

具体參数的使用方式在这个网址上描写叙述的非常具体

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

4、CURLcode curl_easy_perform(CURL * easy_handle);

像我们刚才提到的那样,这个函数应该是在init和setopt之后使用的,这个函数一旦运行,将会通知libcurl运行我们之前设置的全部方法,值得注意的是,当一个handle被增加到一个multi handle中之后,该參数handle将不能被函数perform调用

五、实例演示

1、以下来看一个简单的实例:

#include<stdio.h>
#include<curl/curl.h>
int main(int argc,char** argv)
{
CURL *pCurlHandle = NULL;
CURLcode errorCode = 0;
/*1. 初始化一个pCurlHandle*/
pCurlHandle = curl_easy_init(); if( pCurlHandle )
{
/*2. 设置pCurlHandle的URL*/
curl_easy_setopt( pCurlHandle,CURLOPT_URL, "http://blog.csdn.net/jxnu_xiaobing" );
/*3. 由于上述网址已被重定向了。所以设置为CURLOPT_FOLLOWLOCATION*/
curl_easy_setopt( pCurlHandle,CURLOPT_FOLLOWLOCATION, 1L );
/*4. 開始运行上述opt*/
errorCode = curl_easy_perform(pCurlHandle );
if( errorCode != CURLE_OK )
{
printf("curl_easy_perform() failed \n ");
}
}
else
{
printf(" curl_easy_init() failed \n ");
}
/*5. 最后关闭pCurlHandle*/
curl_easy_cleanup( pCurlHandle );
return 0;
}

2、上述的样例比較简单就是一个訪问网页的样例。以下继续学习一个ftp上传的样例

#include<stdio.h>
#include<string.h>
#include<curl/curl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h> #defineLOCAL_FILE "/tmp/xiaobing.txt"
#defineREMOTE_URL "ftp://172.30.26.247:21/xiaobing.txt" static size_tread_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
curl_off_t nread;
/* in real-world cases, this would probablyget this data differently
as this fread() stuff is exactly what thelibrary already would do
by default internally */
size_t retcode = fread(ptr, size, nmemb,(FILE*)stream); nread = (curl_off_t)retcode; fprintf(stderr, "*** We read %"CURL_FORMAT_CURL_OFF_T
" bytes from file\n",nread);
return retcode;
} int main(int argc,char **argv)
{
CURL *pCurlhandle;
CURLcode res;
FILE *hd_src;
struct stat file_info;
curl_off_t fsize; /*1. 获取待上传文件的大小 */
if(stat(LOCAL_FILE, &file_info)) {
printf("Couldnt open '%s': %s\n",LOCAL_FILE, strerror(errno));
return 1;
}
fsize = (curl_off_t)file_info.st_size; printf("Local file size: %"CURL_FORMAT_CURL_OFF_T " bytes.\n", fsize); /*2. 获取待上传文件的描写叙述符 */
hd_src = fopen(LOCAL_FILE, "rb"); /*3. 初始化全部可能的调用*/
curl_global_init(CURL_GLOBAL_ALL); /*4. 创建一个curlhandle*/
pCurlhandle = curl_easy_init();
if(curl)
{ /*5.设置一个回调函数 */
curl_easy_setopt(pCurlhandle, CURLOPT_READFUNCTION, read_callback); /*6.使能上传标志位 */
curl_easy_setopt(pCurlhandle, CURLOPT_UPLOAD, 1L); /*7.指定ftpserver的url */
curl_easy_setopt(pCurlhandle,CURLOPT_URL, REMOTE_URL); /*8.指定须要上传的文件 */
curl_easy_setopt(pCurlhandle, CURLOPT_READDATA, hd_src); /*9.设置待上传文件的大小,这个大小是上面获取到的注意:当參数
为CURLOPT_INFILESIZE_LARGE的时候。size类型应该是curl_off_t的,
当參数为CURLOPT_INFILESIZE的时候size应该是long类型的*/
curl_easy_setopt(pCurlhandle, CURLOPT_INFILESIZE_LARGE,
(curl_off_t)fsize); /*10. 開始运行我们上述设定的方法*/
res= curl_easy_perform(pCurlhandle);
/*11. 检查是否运行成功 */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res)); /*12. 关闭pCurlhandle*/
curl_easy_cleanup(pCurlhandle);
}
fclose(hd_src); /* close the local file */
/*13. 清除全部可能的调用*/
curl_global_cleanup();
return 0;
}

上述程序就行实现ftp上传文件

3、最后来看一个tfp下载的实例:

/*************************************************************************************
* * 文件名称: TfpcurlDownload.c
* * 功能: curl測试程序
* * 作者: http://blog.csdn.net/King_BingGe
* * 创建时间: 2014年09月29号
* * 最后改动时间: 2014年09月29号
* * 具体: 无
* **************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h> #define REMOTE_URL "ftp://172.30.26.247:21/xiao.txt" typedef struct Ftpfile {
const char *filename;
FILE *stream;
}Cftpfile; static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
Cftpfile *out = (Cftpfile*)stream;
if( out && !out->stream )
{
out->stream = fopen(out->filename, "wb");
if(!out->stream)
{
printf("write_callback failed \n ");
return -1;
}
}
return fwrite(ptr, size, nmemb, out->stream);
} int main(int argc, char **argv)
{
CURL *pCurlhandle;
CURLcode res;
curl_off_t fsize; Cftpfile ftpfile = {
"/tmp/xiaoxiao.txt" ,
NULL
}; /*3. 初始化全部可能的调用*/
curl_global_init(CURL_GLOBAL_ALL); /*4. 创建一个curlhandle*/
pCurlhandle = curl_easy_init();
if(pCurlhandle)
{
/*5. 设置一个回调函数 */
curl_easy_setopt(pCurlhandle, CURLOPT_WRITEFUNCTION, write_callback );
/*7. 指定ftpserver的url */
curl_easy_setopt(pCurlhandle,CURLOPT_URL, REMOTE_URL); /*8. 指定须要上传的文件 */
curl_easy_setopt(pCurlhandle, CURLOPT_USERPWD, "cdn_ftp:123456"); /*9. 指定须要上传的文件 */
curl_easy_setopt(pCurlhandle, CURLOPT_WRITEDATA, &ftpfile ); /*10. 设置待下载文件的大小。这个大小是上面获取到的注意:当參数
为CURLOPT_INFILESIZE_LARGE的时候,size类型应该是curl_off_t的。
当參数为CURLOPT_INFILESIZE的时候size应该是long类型的*/
curl_easy_setopt(pCurlhandle, CURLOPT_INFILESIZE_LARGE,
(curl_off_t)fsize);
/*11. 開始运行我们上述设定的方法 */
res = curl_easy_perform(pCurlhandle);
/*12. 检查是否运行成功 */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res)); /*13. 关闭pCurlhandle*/
curl_easy_cleanup(pCurlhandle);
}
else
{
printf("curl_easy_init failed \n ");
}
/*14. 清除所有可能的呼叫*/
curl_global_cleanup();
return 0;
}

Libcurl最初的实现tfp上传和下载功能的更多相关文章

  1. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  2. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  3. EBS开发附件上传和下载功能(转)

    原文地址: EBS开发附件上传和下载功能 上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统 ...

  4. 【Python学习 】Python实现的FTP上传和下载功能

    一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...

  5. SpringMVC+Ajax实现文件批量上传和下载功能实例代码

    需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...

  6. JavaWeb中的文件上传和下载功能的实现

    导入相关支持jar包:commons-fileupload.jar,commons-io.jar 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上 ...

  7. C#实现FTP文件的上传、下载功能、新建目录以及文件的删除

    本来这篇博文应该在上周就完成的,可无奈,最近工作比较忙,没有时间写,所以推迟到了今天.可悲的是,今天也没有太多的时间,所以决定给大家贴出源码,不做详细的分析说明,如果有不懂的,可以给我留言,我们共同讨 ...

  8. 微信JS图片上传与下载功能--微信JS系列文章(三)

    概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...

  9. EBS开发附件上传和下载功能

    上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统管理员文档:二是通过PL/SQL Gate ...

随机推荐

  1. OAuth和OpenID的区别(转)

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.  OAuth协议为用户资源的授权提 ...

  2. JS数据绑定模板artTemplate试用

    之前写JS绑定数据曾经用过tmpl库,虽然功能比较强大但是感觉不是很轻量,对于相对简单的数据需求显得有些臃肿.而Ajax返回数据自己拼接html的方式又显得不够高端,因此今天看了一篇介绍artTemp ...

  3. Cannot update paths and switch to branch at the same time(转)

    当使用git进行操作: git checkout -b local-name origin/remote-name 出现错误: fatal: git checkout: updating paths ...

  4. rman(上)

    CHANGE命令更改备份和副本的状态  1.change backupset 100 unavailable    CATALOG命令是用来备份的碎片和复制信息到RMAN数据库  1.息增加到RMAN ...

  5. hibernate 管理 Session(单独使用session,不spring)

    Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...

  6. cocos2d-x-2.2的SimpleAudioEngine::sharedEngine()-&gt;playEffect()计划中断bug

    在该计划已经正常,但现在突然发iphone播放声音上就挂了.播放音乐是没有问题的. android没问题. xcode给定的位置,如下面的附图: 网上搜了一下,说是有全局断点造成的.于是command ...

  7. WebService到底是什么? [转]

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  8. HDU 1248 冰封王座(dp)

    Problem Description 不死巫妖王拉工资,死亡骑士得到N美元的钞票(记,只有一个纸币),战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买 ...

  9. Func和Action的用法区别

    平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Say后 ...

  10. Matlab图像处理系列4———傅立叶变换和反变换的图像

    注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...