最近在需要使用curl的上传功能,使用libCurl来实现。因此,先使用curl命令操作,然后再使用libCurl实现。

基于Http协议的文件上传的标准方法是: 基于POST Form的文件上传  RFC1867。

这个方法使用非常广泛,这个RFC规定了FORM上传文件的标准方法,如下介绍了基于libcurl来开发upload功能。

开发实现过程

1. 使用curl 命令行执行代码,  2. 跟踪分析 curl的request和response, 3.使用libCurl的API进行开发实现

0. 搭建  upload server

--- 这个请google一些WebServer的搭建,已经参考RFC1867 或网上例子选择任意一种语言,编写网络后太处理代码。

我使用python的django framework编写了一个upload处理页面,

需要FORM的字段

Title-newFileNameInServer

FILE=@....../abc/

url http://192.168.0.61/due/upload/

1. 使用Curl 上传文件的命令

curl -F"title=dddd.txt" -F "file=@/home/chenglun/upload/abc" http://192.168.0.61/due/upload/

2. 分析

curl --trace trace.log -F"title=dddd.txt" -F "file=@/home/chenglun/upload/abc" http://192.168.0.61/due/upload/

log:

=> connect....

=> Send header, 298 bytes (0x12a)

POST /due/upload  ......  bound.....

<= Recv header, 23 bytes (0x17)

HTTP/1.1 100 Continue..

=> Send data, 249 bytes (0xf9)

bound...

Content-Disposition:form-data; name ....

....

bound...

<= Recv header, 17 bytes (0x11)

HTTP/1.1 200 OK..

..............

从trace中可以知道,只需要building一个form,加入对应的Key=value部分然后使用curl的request即可实现如上传输过程。

3. 使用libCurl实现

使用API有:   curl_formadd(); curl_formfree 生成 一个from,然后使用 curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);设置curl,然后执行,即可。

curl_formadd()使用参考, libCurl的文档,文档有例子的。

代码上半部:

int main() {
    CURL *curl;
    CURLcode res;
    struct data config;
    struct stat file_info;

const char * localfile = "/home/chenglun/upload/abc"";
    FILE * fp = fopen(localfile, "rb"); 
    if(!fp)    {
        return -1;
    }

if(fstat(fileno(fp), &file_info) != 0)    {
        return -1;
    }

curl = curl_easy_init();

if(curl) {
        struct curl_httppost* post = NULL;
        struct curl_httppost* last = NULL;

const char * remoteNewFileKey = "title";
        const char * remoteNewFileName = "d.ttt";
        curl_formadd(&post, &last, CURLFORM_COPYNAME, remoteNewFileKey, CURLFORM_COPYCONTENTS, remoteNewFileName, CURLFORM_END);  
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, localfile, CURLFORM_END);
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "send", CURLFORM_END);
        curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);

下半部:

curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size); // upload file size--- Content-Length: size

curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, 20*1000);    // speed limit

// verbal -- for debug                
        // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);                
        // curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);                    
                // curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config);                        
                
                // progress callback                
        //curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);                
        //curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, cbProgress);
        res = curl_easy_perform(curl);
        if(res != 0){
            ERROR("err string %s", curl_easy_strerror(res));                
        }
        curl_easy_cleanup(curl);   
    } 
    fclose(fp);
    return 0;
}

libCurl的文件上传的更多相关文章

  1. 使用libcurl进行文件上传

    上篇博文讲到了如何使用multicurl来进行http并发访问,今天继续有关curl的主题,来八一八如何使用curl来上传文件,在介绍具体方法之前了解下目前http文件上传的基本实现. rfc1867 ...

  2. CURL 和LIBCURL C++代码 上传本地文件,好不容易碰到了这种折腾我几天的代码

    解决了什么问题:curl在使用各种方式上传文件到服务器.一般的文件上传是通过html表单进行的,通过CURL可以不经过浏览器,直接在服务器端模拟进行表单提交,完成POST数据.文件上传等功能. 服务器 ...

  3. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  4. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  5. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  6. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  7. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

  8. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

  9. AutoIt实现Webdriver自动化测试文件上传

    在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...

随机推荐

  1. [转]spring 监听器 IntrospectorCleanupListener简介

    "在服务器运行过程中,Spring不停的运行的计划任务和OpenSessionInViewFilter,使得Tomcat反复加载对象而产生框架并用时可能产生的内存泄漏,则使用Introspe ...

  2. FusionCharts属性大全

    属性的分类就以官方的API文档为准吧: 1.Chart: <1>Functional Attributes(功能属性) <2>Titles and AxisNames(标题和坐 ...

  3. MySQL 基础学习

    http://www.w3school.com.cn/sql/ 1.limit x,y 或 limit z  :选取从x开始的y条数据  或  选取最开始的 z条数据 , 2.like '%N%' : ...

  4. 编程器NAND Flash 技术入门

    NAND Flash分类 SLC(Single-Level Cell)架构:单一储存单元(Cell)可储存1bit data MLC(Multi-Level Cell)架构:单一储存单元(Cell)可 ...

  5. openStack开源云repo db local or on-line 实战部署之Ruiy王者归来

    preface/pre,获取OpenStack核心模块组件及其子组件包(当前仅针对centos6*)及其依赖包 eg,picture

  6. Quick Tip: Outline Elements on Hover

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element Qu ...

  7. Stars(树状数组+线段树)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  8. [置顶] js模板方法的思路及实现

    在js中如何实现设计模式中的模板方法? 思路的产生必然要求熟悉js,如何实现?就很简单了,都知道在js中如果定义两个相同名称的方法,前一个方法就会被后一个方法覆盖掉,使用此特点就可以实现模板方法. 例 ...

  9. 【方法2】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录

    依据guigui111111的建议:先把Map按Key从大到小排序,然后再把Key和Value互换.这也是一种非常好的思路,我写了一下代码,顺便贴上来,供大家參考与分享. package shuai. ...

  10. virtualbox中新版本Ubuntu安装软件增强包后重启无限登录界面的解决办法

    原来我虚拟机版本是4.2.10,装的Ubuntu3.3,因为版本过老使用出现了一些问题,于是换成14.04,安装成功,但是装增强包的时候,装完重启,无限登录界面,密码是对的. 看了网上的很多方法,什么 ...