libevent 上传文件-程序员宅基地



print_log("evhttp_connection_get_bufferevent() ok\n");


// Fire off the request
req = evhttp_request_new(http_post_done, bev);
if (req == NULL) {
fprintf(stderr, "evhttp_request_new() failed\n");
goto error;
}




char tmp_buf[256] = { 0 };


output_headers = evhttp_request_get_output_headers(req);
evhttp_add_header(output_headers, "Host", host);
evhttp_add_header(output_headers, "Connection", "keep-alive");



print_log("%s", data_file);

FILE * f = fopen(data_file, "rb");
char buf[1024];
size_t s;
size_t bytes = 0;


if (!f) {
syntax_();
goto error;
}


output_buffer = evhttp_request_get_output_buffer(req);


char head_buf[256];
int tmplen = strlen("------WebKitFormBoundaryAnNdXIAa997m6AMZ\r\n");
evbuffer_add(output_buffer, "------WebKitFormBoundaryAnNdXIAa997m6AMZ\r\n", strlen("------WebKitFormBoundaryAnNdXIAa997m6AMZ\r\n"));


sprintf(head_buf, "Content-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n", _filename);
tmplen += strlen(head_buf);
evbuffer_add(output_buffer, head_buf, strlen(head_buf));

sprintf(head_buf, "Content-Type: application/octet-stream\r\n\r\n");
tmplen += strlen(head_buf);
evbuffer_add(output_buffer, head_buf, strlen(head_buf));


while ((s = fread(buf, 1, sizeof(buf), f)) > 0) {
evbuffer_add(output_buffer, buf, s);
bytes += s;
}


sprintf(head_buf, "\r\n------WebKitFormBoundaryAnNdXIAa997m6AMZ--\r\n");
tmplen += strlen(head_buf);
evbuffer_add(output_buffer, head_buf, strlen(head_buf));


evutil_snprintf(buf, sizeof(buf)-1, "%lu", (unsigned long)bytes + tmplen);
evhttp_add_header(output_headers, "Content-Length", buf);


evhttp_add_header(output_headers, "Cache - Control", "max - age = 0");


//sprintf(tmp_buf, "http://%s", host);
//evhttp_add_header(output_headers, "Origin", tmp_buf);


//evhttp_add_header(output_headers, "Origin", "null");
evhttp_add_header(output_headers, "Upgrade - Insecure - Requests", "1");
//evhttp_add_header(output_headers, "User - Agent", "Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 56.0.2924.87 Safari / 537.36");




sprintf(tmp_buf, "multipart/form-data;boundary=%s", "----WebKitFormBoundaryAnNdXIAa997m6AMZ");
evhttp_add_header(output_headers, "Content-Type", tmp_buf);
evhttp_add_header(output_headers, "Accept", "text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, */*;q=0.8");
evhttp_add_header(output_headers, "Accept-Encoding", "gzip, deflate, br");
evhttp_add_header(output_headers, "Accept-Language", "zh-CN,zh;q=0.8");






fclose(f);






r = evhttp_make_request(evcon, req, EVHTTP_REQ_POST, uri);
if (r != 0) {
fprintf(stderr, "evhttp_make_request() failed\n");
goto error;
}


event_base_dispatch(base);
goto cleanup;


error:
ret = 1;
cleanup:
if (evcon)
evhttp_connection_free(evcon);
if (http_uri)
evhttp_uri_free(http_uri);
event_base_free(base);


return ret;
}


#endif
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dp__mcu/article/details/75012335

智能推荐

黑马程序员--集合(Map以及Collections)-程序员宅基地

Map集合: |--Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。 |--HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable. |--TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。 Map集合存储和Collection有着很大不同: Collec

利用python的BitTorrent扩展库,解析BitTorrent文件_python bittorrent库-程序员宅基地

根据BitTorrent文件的格式,用C++写一个也不难,主要是逐个读和解析,发现python有这库就更好了,下一个BitTorrent的bencod第三方库,其中主要是bencode.py,把它放到工程就行,写了个简单的python就可解析了:import bencodedef torrent2dict(filename): f = open(filename, '_python bittorrent库

iOS UITableView 禁止上下滑动_ios tablview 禁止向下滚动-程序员宅基地

由于tableView继承于ScrollView所以禁止tableView的滑动直接 tableView.scrollEnabled = NO;_ios tablview 禁止向下滚动

关于二进制的常用代码(学习笔记)_二进制代码摘要_Cabbage coder的博客-程序员宅基地

大佬们常用的无穷大量:const int inf = 0x3f3f3f3f;快速判断二进制中有几个1方法1:这里涉及一个&的知识点,&是按位与,就是在一位一位的做与运算,while(n>0) //这一句,当n不等于0的时候循环执行以下循环体,n等于0的变化条件在n>>=1这一句,将n左移一位,这样当n中所有的”1”位都移出时,就跳出循环了{if((n&1)==1) //这句逐个通过位与的方式查看当前n最左边的一位是不是1,若是,则n&1=1,_二进制代码摘要

路径搜索算法 python实现_教程 | 如何在Python中快速进行语料库搜索:近似最近邻算法...-程序员宅基地

原标题:教程 | 如何在Python中快速进行语料库搜索:近似最近邻算法选自Medium作者:Kevin Yang参与:路雪最近,我一直在研究在 GloVe 词嵌入中做加减法。例如,我们可以把「king」的词嵌入向量减去「man」的词嵌入向量,随后加入「woman」的词嵌入得到一个结果向量。随后,如果我们有这些词嵌入对应的语料库,那么我们可以通过搜索找到最相似的嵌入并检索相应的词。如果我们做了这样..._create_args():

学习MSCKF笔记——后端、状态预测、状态扩增、状态更新_msckf状态-程序员宅基地

学习MSCKF笔记——后端、状态扩增学习MSCKF笔记——后端、状态扩增学习MSCKF笔记——后端、状态扩增为了看懂后端代码,我先看了下《Quaternion kinematics for the error-state Kalman filter》这篇参考文献,写了两篇总结文档学习MSCKF笔记——四元数基础学习MSCKF笔记——误差状态卡尔曼滤波MSCKF的后端内容还是很多的,Stereo-MSCKF的代码也写得很好,通过读代码将MSCKF后端流程图总结如下:下面我将后端中几个关键的知识点_msckf状态

随便推点

hdu3001 Traveling (三进制状态压缩dp)-程序员宅基地

【题目大意】10个点的TSP问题,但是要求每个点最多走两边,不是只可以走一次,所以要用三进制的状态压缩解决这个问题。可以预处理每个状态的第k位是什么。【解析】和tsp问题相同,类似于上面那个题【状态转移方程】dp[j][i]=min(dp[j][i],dp[k][l]+map[k][j]); j表示终点 i为二进制表示状态 1表示经过 0表示不经过 把所有可能的路径排列

WordPress使用OSS详尽教程(使用OSS非下载图片)-程序员宅基地

原文链接:点击打开链接最近在阿里云申请了一个OSS,OSS是个开放存储器,闲话不多说,我们做项目的时候就是拿它当作专门存储图片的,可以看成一个云端的硬盘。WordPress其实是有插件可以直接使用OSS,但是由于OSS时常改进,所以该插件使用的时候会有点问题,反正我就遇到了很多问题,这里给大家详尽讲解一下如何使用oss4wp的全部过程。  首先,

通过形状先验引导的3D目标检测方法(Disp R-CNN解读)_3D视觉工坊的博客-程序员宅基地

来源丨AI 修炼之路问题,我们提出在不需要雷达点云的情况下,使用统计形状模型生成密集视差伪真值,这使得我们的系统具有更广泛的适用性。在KITTI数据集上进行的实验表明,即使在训练时不使用雷..._形状先验

Python3.8.1安装步骤及环境配置_python 3.8.1-程序员宅基地

勾选前五个!!!等待安装2.安装Pycharm路径中最好不要有特殊字符和空格勾选64和.py等待安装3.python环境变量配置右击计算机,点击属性,点击高级系统设置找到path,点击编辑新建python的路径,如果是windows7,在最后面加上英文状态下的分号和python路径4.打开pycharm,创建新项目是的注意事项,如下图:点击close..._python 3.8.1

在VMWare上运行VOD系统_vm#276dda1#0#1#hotvod-程序员宅基地

虚拟机上安装WinXP,C盘为FAT32分区。 1 安装ardos3.exe 2 我打算使用启动菜单为两个启动项目,双击“VOD默认-2.cmd”。 重启电脑,按默认启动方式应该能进入VOD Server系统,但没有进入,出现如下错误: 搜索了一下,这种错误可能是grub4dos版本太老所致。 我们之前安装的矮人DOS3也是比较老的版本,最新的好像有5.3版本了吧。 浏览了一下安装后的系统盘C_vm#276dda1#0#1#hotvod