Libcurl最初的实现tfp上传和下载功能
研究报告指出的目标是使用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上传和下载功能的更多相关文章
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
- 使用SpringMVC框架实现文件上传和下载功能
使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...
- EBS开发附件上传和下载功能(转)
原文地址: EBS开发附件上传和下载功能 上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统 ...
- 【Python学习 】Python实现的FTP上传和下载功能
一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...
- SpringMVC+Ajax实现文件批量上传和下载功能实例代码
需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...
- JavaWeb中的文件上传和下载功能的实现
导入相关支持jar包:commons-fileupload.jar,commons-io.jar 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上 ...
- C#实现FTP文件的上传、下载功能、新建目录以及文件的删除
本来这篇博文应该在上周就完成的,可无奈,最近工作比较忙,没有时间写,所以推迟到了今天.可悲的是,今天也没有太多的时间,所以决定给大家贴出源码,不做详细的分析说明,如果有不懂的,可以给我留言,我们共同讨 ...
- 微信JS图片上传与下载功能--微信JS系列文章(三)
概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...
- EBS开发附件上传和下载功能
上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统管理员文档:二是通过PL/SQL Gate ...
随机推荐
- OAuth和OpenID的区别(转)
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth协议为用户资源的授权提 ...
- JS数据绑定模板artTemplate试用
之前写JS绑定数据曾经用过tmpl库,虽然功能比较强大但是感觉不是很轻量,对于相对简单的数据需求显得有些臃肿.而Ajax返回数据自己拼接html的方式又显得不够高端,因此今天看了一篇介绍artTemp ...
- 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 ...
- rman(上)
CHANGE命令更改备份和副本的状态 1.change backupset 100 unavailable CATALOG命令是用来备份的碎片和复制信息到RMAN数据库 1.息增加到RMAN ...
- hibernate 管理 Session(单独使用session,不spring)
Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...
- cocos2d-x-2.2的SimpleAudioEngine::sharedEngine()->playEffect()计划中断bug
在该计划已经正常,但现在突然发iphone播放声音上就挂了.播放音乐是没有问题的. android没问题. xcode给定的位置,如下面的附图: 网上搜了一下,说是有全局断点造成的.于是command ...
- WebService到底是什么? [转]
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- HDU 1248 冰封王座(dp)
Problem Description 不死巫妖王拉工资,死亡骑士得到N美元的钞票(记,只有一个纸币),战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买 ...
- Func和Action的用法区别
平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Say后 ...
- Matlab图像处理系列4———傅立叶变换和反变换的图像
注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...