libcurl upload file

借助libcurl实现ftp文件上传,断点续传demo梳理。 公司业务,需要实现一个ftp大文件上传的功能,简单搭建一个ftp服务器,首先研究demo,以及断点上传的功能。1:首先了解文件上传相关协议,ftp,sftp或者基于http,其他自己实现等。2:确定基于ftp实现,搭建简单的ftp服务器并用工具确定服务器正常。3:基于现有的服务器,了解相关ftp开源库,使用代码实现文件上传最基本的功能。4:考虑到大文件的传输,首先考虑断点续传功能,后期用线程池/多线程方案进行适配优化。5:考虑使用场景,适配在windows上进行测试,基于qt。 阅读详情
#ifndef http_client_h
#define http_client_h
#include <stddef.h>
typedef size_t (*write_callback)(char *ptr, size_t size, size_t nmemb, void *userdata);
typedef size_t (*progress_callback)(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);


int http_client_post_file(const char* url, const char* filename, write_callback w_cb, progress_callback p_cb);

int http_client_tester(int argc, char **argv);
#endif /* http_client_h */
#include "http_client.h"
#include <curl/curl.h>

#define USE_STDOUT

#ifndef USE_STDOUT
#ifdef WIN32
#include  "debug.h"
#else
#include  "../debug.h"
#endif
#endif

int http_client_post_file(const char* url, const char* filename, write_callback w_callback, progress_callback p_callback) {
    int ret = 0;
    
    struct curl_slist *headers = NULL;
    CURL* curl  = curl_easy_init();
    if (curl)
    {
    #if 1
        //set headers
        //headers = curl_slist_append(headers, "Host: 192.168.110.119");
        headers = curl_slist_append(headers, "Content-Type: multipart/form-data");
        headers = curl_slist_append(headers, "Connection: Keep-Alive");
        headers = curl_slist_append(headers, "Cache-Control: no-cache");
    
        //set headers
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    #endif

        curl_easy_setopt(curl, CURLOPT_URL, url);
                
        if(p_callback != NULL) {
            curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); //
            curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, p_callback); //
        }
        else {
            curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); //
        }

    
        /*
         This callback function gets called by libcurl as soon as there is data received that needs to be saved.
         */
        if(w_callback != NULL) {
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, NULL);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, w_callback);
        }

        /*
         This callback function gets called by libcurl as soon as it needs to read data in order to send it to the peer - like if you ask it to upload or post data to the server.
         */
        //curl_easy_setopt(curl, CURLOPT_READDATA, NULL);
        //curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
        
        //not needed
        curl_easy_setopt(curl, CURLOPT_POST, 1L);                //post
        
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);            //log

        /* set the file size or it will stop if read '\0'*/
        //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, fsize);

        curl_mime *multipart = curl_mime_init(curl);
        curl_mimepart *part = curl_mime_addpart(multipart);
        
        curl_mime_name(part, "name");
        curl_mime_data(part, "alex", CURL_ZERO_TERMINATED);
        part = curl_mime_addpart(multipart);
        curl_mime_name(part, "role");
        curl_mime_data(part, "bat man", CURL_ZERO_TERMINATED);
        part = curl_mime_addpart(multipart);
        
        curl_mime_name(part, "file");
        curl_mime_filedata(part,filename);
        /* Set the form info */
        curl_easy_setopt(curl, CURLOPT_MIMEPOST, multipart);
        
    
        CURLcode code = curl_easy_perform(curl);
        
        curl_mime_free(multipart);
        
        if (code == CURLE_OK) {
            ret = 0;
        }
        else  {
            char msg[512];
            sprintf(msg, "line:%d curl_easy_perform() failed: %s\n", __LINE__, curl_easy_strerror(code));
#ifdef USE_STDOUT
            printf("%s", msg);
#else
            JANUS_LOG(LOG_WARN, "%s", msg);
#endif
            ret = -1;
        }
        
        curl_easy_cleanup(curl);
        curl_slist_free_all(headers);
    }
    
    //fclose(fp);

    return ret;

}

static size_t w_callback(char *ptr, size_t size, size_t nmemb, void *userdata) {
    size_t realsize = size * nmemb;
    char msg[512];
    sprintf(msg, "%s: %zu bytes, %s\n", __FUNCTION__, realsize, ptr);
#ifdef USE_STDOUT
            printf("%s", msg);
#else
            JANUS_LOG(LOG_WARN, "%s", msg);
#endif
    return realsize;

}

static size_t p_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow) {
    char msg[512];
    sprintf(msg, "%s: dltotal=%f, dlnow=%f, ultotal=%f, ulnow=%f \n", __FUNCTION__, dltotal, dlnow, ultotal, ulnow);
#ifdef USE_STDOUT
            printf("%s", msg);
#else
            JANUS_LOG(LOG_WARN, "%s", msg);
#endif
    return 0;
}

int http_client_tester(int argc, char **argv) {
#ifndef USE_STDOUT
    janus_log_init(FALSE, TRUE, NULL);
#endif
    const char* url = "http://localhost:8080/upload";
    const char* filepath = "/Users/alex/work/xcode-workspace/janus/janus_gateway/ffmpeg_tools/recording/ext_recorder_2.ts";
    
    http_client_post_file(url, filepath, w_callback, p_callback);
#ifndef USE_STDOUT
    janus_log_destroy();
#endif
    return 0;
}

VC++调用libcurl开源库实现发送邮件的功能(附源码) libcurl提供了一套统一样式的API接口,我们不用关注各种协议下网络通信的实现细节,只需要调用这些API就能轻松地实现基于这些协议的数据通信。本文将简单地讲述一下使用libcurl实现邮件发送的相关细节。... 阅读详情

相关推荐

libcurl 上传文件

vc6 工程 ,上传文件到web服务器

使用libcurl进行文件上传

上篇博文讲到了如何使用multicurl来进行http并发访问,今天继续有关curl的主题,来八一八如何使用curl来上传文件,在介绍具体方法之前了解下目前http文件上传的基本实现。     rfc1867描述了如何使用http协议来上传客户端文件,目前基本上所有的浏览器和web服务器都支持http文件上传,它的使用也十分的简单,具体的来说就是在页面上创建一个form表单,表单的encty

zy799894671的专栏 1万+

SAP 货币类型和公司代码的货币设置

货币类型分为公司代码和集团货币,一般FI 10类型和集团货币 30,事务代码是8KEM; 设置货币类型的事务代码是OB22 在S/4 1809版本里编辑功能统合到事务代码FINSC_LEDGER 中了,这里集中了分类账和公司代码的设置; 设置多账簿的币种(会出现在BSEG和FAGLFLEXA表中) 汇率维护在TCURR表中,可通过BAPI_EXCHANGERATE_GETDETAIL函数获取。 CO货币的事务代码是成本控制范围货币:OKKP ,一般设置为货币码20和30; 另外, SCC4设置集团货币,

RichardYang2020的博客 1万+

Libcurl上传图片

最近使用C++做一些编程,JAVA中采用HTTP协议通信很简单,我们熟知的HTTPClient就可以完成通信。在C++中BOOST库仅仅将TCP/UDP协议进行了很好的封装,但是HTTP需要我们自己在编写一部分代码才能很好的同步HTTP来完成客户端与服务器端的信息交互。libcurl对HTTP等协议进行了很好的封装,于是采用libcurl来完成图片上传的功能。 1.libcurl简单认识 li

风水月的专栏 8553

STM32 ST-LINK Utility固件烧录全流程详解与实战技巧

本文详细解析了使用STM32 ST-LINK Utility进行固件烧录的全流程与实战技巧。从硬件连接、软件安装、核心三步操作(连接、擦除、烧录)到进阶的选项字节配置与批量脚本烧录,提供了完整的避坑指南和问题排查方案,帮助开发者高效完成STM32程序下载。

lambda的博客 768

基于NXP1778的CAN自动波特率检测

一、概念 NXP1778芯片内部自带一个CAN控制器。CAN模块由两部分组成:控制器和验收滤波器。所有的寄存器和RAM都以32位字宽度来访问。 CAN自动波特率检测主要用于以一种CAN的转换的产品中。产品中CAN部分的波特率以前都是通过网页中修改然后配置下去的,依据实际情况的考虑,如果CAN部分的波特率能够根据客户设备的改变而自动改变,将会增加其灵活性。   二、原理 根据CAN控制器的

菜鸟的痕迹专栏 5271

使用libcurl实现的上传器

头文件 /***********************************************************************Copyright(C)2014--AllRightsReserved**文件名称:Uploader_LibCurl.h*摘要:上传器-...

weixin_34233679的博客 249

react +ant desiagn pro实现按钮操作权限控制

在ant desiagn pro中提供了一个access用于对权限进行控制,需引入useAccess和Access

Sylvasylva的博客 2210

libcurl上传文件

1.libcurl功能简介 https://curl.se/libcurl/ 具体使用方法可以看这里的简介:https://www.cnblogs.com/heluan/p/10177475.html 2.上传文件到ftp上 具体见代码: #include <string> namespace BaseFun { struct UploadFileSession { static bool UploadFile(std::string& response, const std:

游学四方的博客 2668

智警杯1.4---excel可视化

知识点

lulu001128的博客 949

PyTorch实战:从零构建CNN图像分类模型

卷积神经网络(CNN)作为计算机视觉的核心架构,通过局部连接和权值共享机制高效处理图像数据。其核心组件包括卷积层、池化层和全连接层,其中PyTorch的动态计算图特性为CNN实现提供了灵活的开发环境。在工程实践中,使用CIFAR-10这类标准数据集可以快速验证模型性能,而数据增强和批归一化等技术能有效提升模型泛化能力。通过PyTorch实现CNN不仅能够掌握图像分类的基本原理,还能为后续迁移学习和复杂视觉任务打下基础,特别是在结合Adam优化器和学习率调度策略后,模型收敛速度和准确率都能得到显著提升。

weixin_42405592的博客 318

libCurl的文件上传

最近在需要使用curl的上传功能,使用libCurl来实现。因此,先使用curl命令操作,然后再使用libCurl实现。 基于Http协议的文件上传的标准方法是: 基于POST Form的文件上传  RFC1867。 这个方法使用非常广泛,这个RFC规定了FORM上传

阿伦的专栏 1万+

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3198

libcurl移植

一、libcurl描述 1、libcurl功能描述 libcurl主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当封装了的sockPHP支持libcurl(允许你用不同的协议连接和沟通不同的服务器)。, libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap协议。libcurl同样支持HTTPS证书授权,HT

曾经记忆的专栏 3077

【uni-app】PDA扫码枪获取扫码数据APP(通俗易懂),聚焦频繁弹软键盘输入法等各种坑完美解决方法,附完整代码

uniapp PDA扫码枪获取扫码数据APP(通俗易懂),频繁弹软键盘等各种坑完美解决方法

coderYYY的博客 7418

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ubuntu+codeblocks+libcurl FTP上传文件

以前没接触过curl,但是现在要在linux下上传到FTP文件,查了查都说curl比较好,那就研究研究 主要参考的这篇文章:http://blog.youkuaiyun.com/jgood/article/details/4787670 确实提供了很大的帮助,也有一点点自己摸索的地方,在此记录一下: ubuntu版本13.10,codeblocks版本12.11,libcurl版本7.32.0

geagerg的博客 1044

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

libcurl

一、libcurl 主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当封装了的sockPHP 支持libcurl(允许你用不同的协议连接和沟通不同的服务器)。, libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, F...

weixin_30496751的博客 278

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

libcurl http download upload

//重写把数据读入上传数据流函数 size_t read_file(void* buff, size_t size, size_t nmemb, void* userp) { size_t sizes = fread(buff, size, nmemb, (FILE *)userp); return sizes; } int HTTP_file::upload_file(cons

cupidove的专栏 2852

libcurl教程

原文地址:http://curl.haxx.se/libcurl/c/libcurl-tutorial.html     译者:JGood(http://blog.youkuaiyun.com/JGood )     译者注:这是一篇介绍如何使用libcurl的入门教程。文档不是逐字逐句按原文翻译,而是根据笔者对libcurl的理解,参考原文写成。文中用到的一些例子,可能不是出自原文,而是笔者在学

lxffff1990的博客 539

http参数 libcurl_libcurl http download upload | 学步园

//重写把数据读入上传数据流函数size_t read_file(void* buff, size_t size, size_t nmemb, void* userp){size_t sizes = fread(buff, size, nmemb, (FILE *)userp);return sizes;}int HTTP_file::upload_file(const char* url, co...

weixin_39675513的博客 184

libCurl 库sftp上传和下载

上传: size_t DownloadFtp::read_callback(void *ptr, size_t size, size_t nmemb, void *stream) { curl_off_t nread; /* in real-world cases, this would probably get this data differently as this fread()

cyebo的专栏 5775

curl和libcurl的区别简介

curl和libcurl的区别简介 更新时间:2015年07月01日 15:39:19 投稿:junjie 这篇文章主要介绍了curl和libcurl的区别简介,本文讲解了curl简介、libcurl简介、curl与libcurl对比、“curl”的不同意思、PHP中使用curl和libcurl等内容,这么多的curl,搞都搞不懂,看了本文才知道,我们一直用的其实是libcurl,需要的朋友可以参考下 curl简介 curl是利用URL语法在命令行方式下工作的开源文件传输工具。 它支持很多...

积累点滴,保持自我 3002

libcurl 客户端实例 【转】

原文:http://www.cnblogs.com/wangkangluo1/archive/2012/07/01/2571583.html libcurl 客户端实例 参考库 libftp(though it's in C) ftplib(again, looks like C) libCurlseems to have FTP capabili...

weixin_30731287的博客 100

使用vcpkg 编译支持sftp的libcurl

使用vcpkg 编译支持sftp的libcurllibcurl的编译下载vcpkg编译vcpkg使用vcpkg编译所需的库vs中使用vcpkglibcurl文件上传使用实例 libcurl的编译 下载vcpkg 使用git将vcpkg从github上clone下来:github地址 git clone https://github.com/microsoft/vcpkg 编译vcpkg 使用cmd进入vcpkg所在目录执行批处理文件完成安装。 F:\vcpkg>cd vcpkg F:\vcpkg\v

qq_41883523的博客 2184
上一篇: Mac使用brew安装依赖后pkg-config找不到的处理方法
下一篇: VMWare workstation/player 无法使用bridge模式联网问题的解决方案
dotphoenix
博客等级 码龄19年 208粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值