我开发了C ++应用程序。它下载文件。典型的网址看起来像 https://mysite.com/download.php?fileid=xxx 所以第一个问题 - 我需要获得真正的文件名。 我这样做:
curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, readHeader);
回调
size_t NetworkHelper::readHeader(void *ptr, size_t size, size_t nmemb, void *data)
{
std::string header;
header.assign((char*)ptr, nmemb);
size_t delimPos = header.find_first_of(':');
std::string headerName;
std::string headerContent;
if (delimPos != std::string::npos)
{
headerName = header.substr(0, delimPos);
headerContent = header.substr(delimPos + 1, header.length());
m_headers[headerName] = headerContent;
}
return size*nmemb;
}
这里我将标题及其值插入到地图中 每个http标头都会多次调用此回调。我真正需要的标题是“Location:url / realfilename.yyy”。
写回调:
size_t NetworkHelper::writeFileCallback(void* ptr, size_t size, size_t nmemb, void* data)
{
size_t count;
Fetchdata* fetchdata;
fetchdata = (Fetchdata*)data;
std::string fileName = NetworkHelper::m_headers["Location"].c_str();
fileName = "C:/" + fileName.substr(fileName.find_last_of('/') + 1, fileName.length());
fetchdata->stream = fopen( fileName.c_str(),"w+b");
if (fetchdata->stream!=NULL)
{
count = fwrite(ptr, size, nmemb, fetchdata->stream);
if (count > 0)
{
fetchdata->size += (count * size);
}
}
return nmemb*size;
}
这里fopen失败(返回NULL)。我如何处理文件以及如何更好地处理文件是错误的? 感谢。
答案 0 :(得分:1)
首先检查fileName实际包含的内容。 在Windows上使用error()或GetLastError来检查问题所在。 我可能错了,但根据你的代码fileName实际上包含这样的东西: C:/ http://somesimet.somedomain/file.extension upd:对不起,文件名确实错了