使用libcurl POST数据和上传文件

  • 为了具有通用性,将文件的内容读到了fc变量中,fclen是fc的长度。fc也可以是任何其它内容。curl 是 libcurl句柄。演示省略了很多显而易见的步骤。

    1. 普通的post请求,这里用curl_easy_escape对fc做了编码

    std::string data("req=plain");

    data.append("&file=");

    char *efc = curl_easy_escape(curl, fc, fclen);

    data.append(efc)

    curl_free(encoded);

    curl_easy_setopt(curl, CURLOPT_URL, PURGE_URL);

    curl_easy_setopt(curl, CURLOPT_POST, 1L);

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());

    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.size());

    2. multipart/formdata请求

    struct curl_httppost *formpost = 0;

    struct curl_httppost *lastptr  = 0;

    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "reqformat", CURLFORM_PTRCONTENTS, "plain", CURLFORM_END);

    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "file", CURLFORM_PTRCONTENTS, fc, CURLFORM_CONTENTSLENGTH, fclen, CURLFORM_END);

    curl_easy_setopt(curl, CURLOPT_URL, URL);

    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

    curl_easy_perform(curl);

    curl_formfree(formpost);

    3. multipart/formdata请求,不把文件读入fc,其它步骤相同

    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "file", CURLFORM_FILE, "/path/filename", CURLFORM_END);

    4. 通过put上传文件

    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

    curl_easy_setopt(curl, CURLOPT_PUT, 1L);

    curl_easy_setopt(curl, CURLOPT_READDATA, fp);   // FILE *fp = fopen("/path/filename");

    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, fsize);  // fsize = sizeof /path/filename

    5. 发送自己的Header

    struct curl_slist *slist = 0;

    slist = curl_slist_append(slist, "Blog-X-User: username");

    slist = curl_slist_append(slist, "Blog-X-Signature: signature");

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);

    curl_slist_free_all(slist);

时间: 2024-07-29 11:02:32

使用libcurl POST数据和上传文件的相关文章

重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件

原文:重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件 [源码下载] 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之通信的新特性 下载数据(显示下载进度,将下载数据保存到本地) 上传数据(显示上传进度) 上传文件 示例HTTP 服务端WebServer/HttpDemo.aspx.cs /* * 用于响应 http 请求 */ using System; using System.IO;

django-form.errors和上传文件

一.上传文件: 在相应的模型里面定义`FileField`或者是`ImageField`类型的字段,并且1.设置好`upload_to`参数来指定上传的路径. headshot = models.ImageField(u'头像', upload_to="upload/%Y/%m/%d")  # 上传的路径,django自己创建路径 如果是使用ImageField,会需要安装一个依赖Pillow, Pillow是专门做图片处理的一个python包 pip install Pillow 2

在XShell中使用sz和rz命令下载和上传文件

输入命令:sz filename 回车后弹出一个"浏览文件夹"对话框中,选择保存目录 END 使用rz上传文件 输入命令: rz 回车后弹出一个对话框,选择一个或多个文件,选择"打开" 3 上传到服务器的路径为当前执行rz命令的目录,输入命令: dir 查看上传的文件 END

vue+axios通过formdata提交参数和上传文件

demo.vue 文件 <template> <div class="demo"> <input v-model="importForm.month" type="text" name="month"/> <input ref="importFile" type="file" name="importFile" @change

ASIHttpRequest加载网络数据和上传数据功能

使用ASIHttpRequest第三库,需要配置 二, 上传数据功能使用ASIFromDataRequest(可以上传二进制和字符串给服务器) 下面来牛刀小试 //建立一个工程,导入第三方库,在AppDelegate.h #import <UIKit/UIKit.h> #import "ASIFormDataRequest.h" @interface AppDelegate : UIResponder <UIApplicationDelegate,ASIHTTPReq

ansible 通过网络下载和上传文件

1.通过http下载文件,并且不验证证书 - name: download files by https get_url: url: https://robin.org.cn/test.zip dest: /appvol/ansible-test/ validate_certs: no 2. 原文地址:https://www.cnblogs.com/lihuanhuan/p/10957931.html

libcurl上传文件,添加自定义头

原文  http://www.cnblogs.com/meteoric_cry/p/4285881.html 主题 curl libcurl参数很多,一不小心就容易遇到问题.曾经就遇到过一个很蛋疼的问题:libcurl断点下载>> 这里主要汇总一下,libcurl上传的二种方式: 1.直接上传文件,类似form表单<input type=”file” />,<form enctype=”multipart/form-data”…: 2.上传二进制流: 至于设定自定义头,都是使

libcurl上传文件

libcurl参数很多,一不小心就容易遇到问题.曾经就遇到过一个很蛋疼的问题:libcurl断点下载>>   这里主要汇总一下,libcurl上传的二种方式: 1.直接上传文件,类似form表单<input type="file" />,<form enctype="multipart/form-data"-: 2.上传二进制流:   至于设定自定义头,都是使用一样的方法 struct curl_slist *headers=NULL;

原生js上传文件,使用new FormData()

当创建一个内容较多的表单,表单里面又有了文件上传,文件上传也需要表单提交,单一的上传文件很好操作: <form action="接口" enctype="multipart/form-data" method="post"> <input type="file" name="uploadFile"/> <input type="submit" value=&