书接上文

  • 使用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就可以将你的数据缓存全部发送,不用自己计算数据的长度了 ,就避免了出错。