libcurl库的使用--使用http的post发送二进制数据文件

书接上文

  • 使用libcurl进行文件上传文件有几种不同的方式都可以实现,鉴于和后台对接是采用的http的post方式进行上传,因为要做断点续传啊。
  • 问题来了:上传文本文件,多大都没有问题,能够上传,然后上传一个tar.gz的压缩文件,就无法上传,能够正常发送的数据只有3B,难道是这种格式的数据无法上传???不科学啊,人家别人都用的好好的,没有这个问题,所以一定还是我的问题,那么就从自己身上找问题呗。
  • 先来看下代码
header = curl_slist_append(header,"Expect:");           
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,header);
curl_easy_setopt(curl,CURLOPT_URL,url);                                             
curl_easy_setopt(curl,CURLOPT_POST,1);                      
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,fileMem);          

curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,process_data_callback);        
//    curl_easy_setopt(curl,CURLOPT_VERBOSE,1);                        
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)(&chunk));       
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");    
res = curl_easy_perform(curl);                                      
  • 这段代码看着没有问题啊???
  • 终于在某一篇博客中发现了一处人家设置的与我设置的不同之处,原来,我少了一个选项
curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,buffer_len);  

buffer_len是数据 fileMem的长度 ,这里计算切记不可使用strlen去计算,一定是从文件里读出的字节书,否则strlen计算二进制是会死人的。

  • 为什么杀了这个选项就导致二进制数据不能正确的传输(不能正确传输的意思curl_easy_perform函数没有将数据发送到服务端),但是普通的文本文件,包括json字符串都是可以的呢?
  • 我的猜想就是显示的规定了数据长度,而不是交由curl自己去计算的,那么curl就可以将你的数据缓存全部发送,不用自己计算数据的长度了 ,就避免了出错。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WenCoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值