Libcurl实现ftp的下载,上传功能。版本为curl-7.63.0

1、编译vs2015

参考资料:https://blog.csdn.net/yaojingkao/article/details/53044361

2、libcurl传输进度参考:

https://blog.csdn.net/u012234115/article/details/83869486

3、libcurl使用方法参考:

https://www.cnblogs.com/mengfanrong/p/4581068.html

4、在搜索资料的时候,应该注意libcurl版本的问题,不同的版本,用法可能不同。

5、断点续传:

https://www.cnblogs.com/chang290/archive/2012/08/12/2634858.html

官网下载:

解压到本地,使用vs2015打开解决方案:

选择libcurl,DLL Release,32位,进行编译

编译完成后,生成的库文件libcurl.dll  和 libcurl.lib 在下面的目录中

2、使用:vs2015新建测试工程:

需要libcurl的头文件跟动态库。

libcurl头文件路径:

将libcurl头文件跟库文件,放到ftptest.sln解决方案下面

在ftptest.sln同级目录下,新建include和lib目录

将libcurl的头文件拷贝到include目录下

将libcurl的库拷贝到lib目录下目录下

将libcurl头文件加入到工程配置中:

将libcurl库加入到工程配置中:

在工程中连接libcurl库:

对libcurl进行c++封装,测试,c++使用Qt

头文件:

#ifndef FTPLIBCURL_H

#define FTPLIBCURL_H

#include "curl/curl.h"

#include "curl/easy.h"

#include <QObject>

class FtpLibCurl;

struct CustomProgress

{

curl_off_t lastruntime; /* type depends on version, see above */

CURL *curl;

FtpLibCurl* p;

};

class FtpLibCurl : public QObject

{

Q_OBJECT

public:

FtpLibCurl(QObject *parent);

~FtpLibCurl();

public:

void getProg(qulonglong);

void setFile(const QString&);

public slots:

void process();

void downFile();

signals:

void finished();

void error(QString err);

void ftp_prog(QString);

public:

struct CustomProgress prog;

private:

qulonglong m_fileSize;

QString m_s_percentage;

QString m_fileName;

};

#endif // FTPLIBCURL_H

Cpp文件:

#include "FtpLibCurl.h"

//#define F_LOCAL_FILE     "F:/1.jpg"

//#define F_REMOTE_URL     "ftp://192.168.16.166:21//home/msj/1.jpg"

size_t f_read_callback(void *ptr, size_t size, size_t nmemb, void *stream) //回调函数

{

curl_off_t nread;

size_t retcode = fread(ptr, size, nmemb, (FILE*)(stream));

nread = (curl_off_t)retcode;

return retcode;

}

// work for both download and upload

int progressCallback(void *p,

curl_off_t dltotal,

curl_off_t dlnow,

curl_off_t ultotal,

curl_off_t ulnow)

{

struct CustomProgress *progress = (struct CustomProgress *)p;

CURL *curl = progress->curl;

curl_off_t curtime = 0;

curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME_T, &curtime);

/* under certain circumstances it may be desirable for certain functionality

to only run every N seconds, in order to do this the transaction time can

be used */

if ((curtime - progress->lastruntime) >= 3000000)

{

progress->lastruntime = curtime;

//printf("TOTAL TIME: %f \n", curtime);

}

// do something to display the progress

//printf("UP: %ld bytes of %ld bytes, DOWN: %ld bytes of %ld bytes \n", ulnow, ultotal, dlnow, dltotal);

if (ultotal)

{

//printf("UP progress: %0.2f\n", float(ulnow / ultotal));

progress->p->getProg(ulnow);

}

if (dltotal)

{

//("DOWN progress: %0.2f\n", float(dlnow / dltotal));

}

return 0;

}

FtpLibCurl::FtpLibCurl(QObject *parent)

: QObject(parent)

{

prog = {0};

m_s_percentage = QString("0%");

m_fileName.clear();

}

FtpLibCurl::~FtpLibCurl()

{

}

void FtpLibCurl::process()

{

CURL *pCurlhandle;

CURLcode res;

FILE *hd_src;

struct stat file_info;

curl_off_t fsize;

QByteArray ba = m_fileName.toLocal8Bit();

const char *c_str = ba.constData();

/*1. 获取待上传文件的大小 */

if (stat(c_str, &file_info)) {

printf("Couldnt open '%s': %s\n", c_str, strerror(errno));

emit error(QString("local file not exist"));

return;

}

fsize = (curl_off_t)file_info.st_size;

m_fileSize = fsize;

/*2. 获取待上传文件的描写叙述符 */

hd_src = fopen(c_str, "rb");

/*3. 初始化全部可能的调用*/

curl_global_init(CURL_GLOBAL_ALL);

/*4. 创建一个curlhandle*/

pCurlhandle = curl_easy_init();

if (pCurlhandle)

{

curl_easy_setopt(pCurlhandle, CURLOPT_USERPWD, "msj:msj");

/*5.设置一个回调函数 */

curl_easy_setopt(pCurlhandle, CURLOPT_READFUNCTION, f_read_callback);

/*6.使能上传标志位 */

curl_easy_setopt(pCurlhandle, CURLOPT_UPLOAD, 1L);

/*7.指定ftpserver的url */

QStringList path_list = m_fileName.split('/');

QString tmp_url = "ftp://192.168.16.166:21//home/xx/" + path_list.last();

QByteArray url_ba = tmp_url.toLocal8Bit();

const char *url_str = url_ba.constData();

curl_easy_setopt(pCurlhandle, CURLOPT_URL, url_str);

/*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);

// set upload progress

curl_easy_setopt(pCurlhandle, CURLOPT_XFERINFOFUNCTION, progressCallback);

curl_easy_setopt(pCurlhandle, CURLOPT_XFERINFODATA, &prog);

prog.p = this;

curl_easy_setopt(pCurlhandle, CURLOPT_NOPROGRESS, 0);

/*10. 開始运行我们上述设定的方法*/

res = curl_easy_perform(pCurlhandle);

/*11. 检查是否运行成功 */

if (res != CURLE_OK)

{

fprintf(stderr, "curl_easy_perform() failed: %s\n",

curl_easy_strerror(res));

emit error(QString(curl_easy_strerror(res)));

}

/*12. 关闭pCurlhandle*/

curl_easy_cleanup(pCurlhandle);

}

fclose(hd_src); /* close the local file */

/*13. 清除全部可能的调用*/

curl_global_cleanup();

emit finished();

}

void FtpLibCurl::getProg(qulonglong v)

{

int int_percentage = (v / m_fileSize)*100;

QString tmp_percentage = QString::number(int_percentage) + "%";

if (m_s_percentage!= tmp_percentage)

{

m_s_percentage = tmp_percentage;

emit ftp_prog(tmp_percentage);

}

}

void FtpLibCurl::downFile()

{

}

void FtpLibCurl::setFile(const QString& s)

{

m_fileName = s;

}

测试代码:

QThread *thread = new QThread();

FtpLibCurl *worker = new FtpLibCurl(nullptr);

worker->setFile(QString("F:/1.jpg"));

worker->moveToThread(thread);

// 错误处理

connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));

// 处理数据

connect(thread, SIGNAL(started()), worker, SLOT(process()));

// 退出、删除

connect(worker, SIGNAL(error(QString)), this, SLOT(ftp_error(QString)));

connect(worker, SIGNAL(finished()), thread, SLOT(quit()));

connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));

connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

// 启动线程

thread->start();

libcurl编译使用,实现ftp功能的更多相关文章

  1. qt5集成libcurl实现tftp和ftp的方法一:搭建环境(五篇文章)

    最近使用QT5做一个软件,要求实现tftp和ftp文件传输,使用QT5开发好UI界面等功能,突然发现QT5不直接提供tftp和ftp支持,无奈之下只好找第三方库来间接实现,根据网友的介绍,libcur ...

  2. 无需重新编译php加入ftp扩展的解决方法

    无需重新编译php加入ftp扩展的解决方法   本文为大家介绍无需重新编译php加入ftp扩展的方法,有需要的朋友可以参考下   首先,进入源码目录cd php-5.2.13/ext/ftp #运行p ...

  3. Nginx服务编译安装、日志功能、状态模块及访问认证模式实操

    系统环境 [root@web ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@web ~]# uname -a Linux d ...

  4. 使用commons-net做FTP功能的异常 java.lang.ClassNotFoundException: org.apache.oro.text.regex.Malformed

    最近使用Apache的commons-net.jar做FTP上传下载功能,点击“上传”的时候报错,如下: java.lang.ClassNotFoundException: org.apache.or ...

  5. python网络编程--socketserver 和 ftp功能简单说明

    1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...

  6. libcurl编译及使用

    环境: libcurl版本:7.54.1 VS:Visual Studio 2013 一.编译 1.下载最新版的libcurl(curl-7.54.1.zip)(地址:https://curl.hax ...

  7. Win7的ftp功能

    ftp作为文件传输协议,在一些特殊情况下用这种文件传输是比较方便的,并且win7本身也支持这个功能,在控制面板--->程序-->打开或关闭Windows功能,安装即可: 然后在管理控制台中 ...

  8. python socketserver 实现 ftp功能

    需求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当前目 ...

  9. python 基于windows环境的ftp功能

    描述: 1.基于备份服务器部署的py程序,将需要备份主机目录下的内容下载至备份服务器(服务端和远端都是windows server 2008) 2.py程序部署在windows服务器,后台运行,基于b ...

随机推荐

  1. python之SQLAlchemy组件

    介绍 SQLAlchemy 是一个 ORM 框架,可以帮助我们使用面向对象的方式快速实现数据库操作. 组成部分: Engine,框架的引擎 Connection Pooling ,数据库连接池 Dia ...

  2. 查看文件内容 cat , tac

    cat  文件名字tac  文件名字  --  倒序查看文件内容

  3. [warn] _default_ VirtualHost overlap on port 443, the first has precedence

    配置文件中添加 NameVirtualHost *:433 保存重启apache

  4. JavaScript 常用数组函数方法专题

    1. 由字符串生成数组 split() 分割字符串,并将分割的部分作为一个元素保存在一个新建的数组中. var str1 = "this is an emample to using the ...

  5. linux----------linux下配置内网ip

    1./etc/sysconfig/network-scripts/ifcfg-eth1   创建这个文件里面的内容如下 TYPE="Ethernet" BOOTPROTO=&quo ...

  6. Python之猴子补丁

    1.在运行时,对属性,方法,函数等进行动态替换 2.其目的往往是为了通过替换,修改来增强,扩展原有代码的能力 #test2.py class Person: def get_score(self): ...

  7. h5 实现定位

    直接上代码,代码使用了vue相关的语法 并且引入了dialog插件 ,使用时直接调用getLocation()方法就可以了! // 定位 function getLocation(){ console ...

  8. Servlet+纯java+MySQL实现课程信息的增删改查

    Dbutil: package com.zh.util; import java.sql.Connection; import java.sql.DriverManager; import java. ...

  9. hisicv200 exfat支持

    由于项目中需要128Gsd卡支持.所以内核里面需要支持exfat 1.exfat 由于版权问题,所以linux kernel一直都没法支持,由于某些公司在linux kernel 3.9版本开源exf ...

  10. javascript监听按键

    document.addEventListener('keydown',test); function test(e){ var x=e.keyCode; if(x == 49){ console.l ...