Libcurl -下载和保存文件的真实名称
Libcurl - downloading and saving file with its real name
本人开发c++应用程序。它下载文件。典型的url是这样的 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;
}
在这里,我将标头及其值插入到map中此回调会为每个HTTP标头调用多次。我真正需要的头是"位置: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)。我处理文件的方式是错误的,如何更好地做到这一点?谢谢。
首先检查fileName实际包含的内容。在windows上使用error()或GetLastError来检查问题所在。我可能是错的,但根据你的代码fileName实际上包含这样的东西:C:/http://somesimet.somedomain/file.extension更新:对不起,文件名写错了
相关文章:
- 激励'inline'说明符的真实世界示例?
- 你能重载对象变量名本身返回的内容吗
- 有没有一种方法可以在编译时获得作用域类名
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 在C/C++中将变量名定义为__00000001有什么好处吗
- 函数名是c中该函数的第一条指令的地址吗
- C++中的VLA,扩展名为std=C++11
- 错误:需要类名(链表c++)
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 具有条件类型名的模板类
- 如何转换真实路径 CString c++
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 如何按文件扩展名引用文件夹中的文件
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- C++20 概念:如何在"requires"子句中引用类名?
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 数数并选择 sqlite 中的前三名
- 使用 gmock c++ 在真实对象上调用方法
- 是否可以在编译时限制类的实例数?
- 查找索引的最接近的真实值