您好我正在尝试保存CURL服务器响应并收到以下错误: 我读到这是因为读取和写入文件的数据之间的大小不同,因此curl正在破碎。文件已创建并包含需要的XML数据但仍显示错误。谢谢你的帮助!!
写入正文失败(0!= 96)
写入数据失败
关闭连接#0
这是我的cb函数:
static size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{ size_t written = fwrite(ptr, size, nmemb, stream); return written; }
和方法:
createJob(std :: string s,std :: string directory){
static const char *fp = "resultcurl.xml";
std::stringstream filepath;
filepath<< directory;
filepath<< fp;
std::string pagefilename = filepath.str();
FILE *pagefile;
std::string job_id;
struct curl_slist *headers = NULL;
std::string jobXML = s;
curl = curl_easy_init();
if (curl) {
headers = curl_slist_append(headers, "Accept: */*");
headers = curl_slist_append(headers, "Content-Type: application/xml");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl, CURLOPT_URL,
".../jobs.xml");
curl_easy_setopt(curl, CURLOPT_USERPWD, "...");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jobXML.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(jobXML.c_str()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_data);
pagefile = fopen(pagefilename.c_str(), "wb");
if (pagefile) {
curl_easy_setopt(curl, CURLOPT_FILE, pagefile);
//curl_easy_perform(curl);
}
res = curl_easy_perform(curl);
/* cleanup curl stuff */
curl_easy_cleanup(curl);
//job_id =readXMLvalue(pagefilename);
fclose(pagefile);
return 0;
}
答案 0 :(得分:2)
交换设置的顺序,
pagefile = fopen(pagefilename.c_str(), "wb");
if (pagefile) {
curl_easy_setopt(curl, CURLOPT_FILE, pagefile);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_data);
...
}
...
答案 1 :(得分:0)
如果您只想将数据写入文件,Curl会为您完成。设置
if(curl_easy_setopt( curl , CURLOPT_WRITEDATA , (void *) fptr ) != CURLE_OK)
{
return(YOUR_ERR_CODE) ;
}
其中fptr是,
FILE *fptr = fopen( "emalware.127.5a6ceb78050f80e4c833dcc3764bf9dd.gzip", "wb" );
if( fptr == NULL )
{
return -1;
}