C++下载IE缓存大文件
方式一、原来用
1 | ShellExecute |
直接打开浏览器的方式,可以直接下载缓存中的文件
可是不能用于UI交互,而且用户能看到url地址
1 2 3 4 5 | CString strUrl = “url。。。” CString strPrama; strPrama.Format(_T( "?programId=%d&orgCode=%s&fileName=%s" ), m_id , get_torg_code(), m_name); ShellExecute(NULL, _T( "open" ), strUrl + strPrama, NULL, NULL, SW_SHOWNORMAL); |
方式二,用URLDownloadToFile,下载小文件还行,文件一旦过大(具体数字没有查看,没有查找瓶颈)可以下载100多KB的,下载299KB就失败
DeleteUrlCacheEntry(strPathUrl);
HRESULT hr = URLDownloadToFile(NULL, strUrl, stLocalFile, 0, NULL);
方式三,用curl,可以下载缓存,可以下载具体路径的
1 2 3 4 5 6 | 类中声明 BOOL CurlDownloadFile(CString strLocalFile); static size_t DealReqReply( void *buffer, size_t size, size_t nmemb, void *userp); //下载文件数据接收函数 回调函数需要是 static 或者全局函数 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | BOOL CDlgXXXX::CurlDownloadFile(CString strLocalFile) { BOOL bRet = FALSE; string szLocalFile = CStringFun::wstring_to_string(strLocalFile.GetBuffer(0)); strLocalFile.ReleaseBuffer(); FILE *fp = fopen (szLocalFile.c_str(), "wb" ); if (fp == NULL) { return bRet; } CURL *curl = curl_easy_init(); struct curl_httppost *formpost = NULL; struct curl_httppost *lastptr = NULL; char cId[16] = {0}; _itoa_s(m_project->m_id, cId, 16, 10); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "programId" , CURLFORM_COPYCONTENTS, cId, CURLFORM_END); CString strOrg = m_zj_libmgr->get_torg_code(); string szOrg = CStringFun::wstring_to_string(strOrg.GetBuffer()); strOrg.ReleaseBuffer(); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "orgCode" , CURLFORM_COPYCONTENTS, szOrg.c_str(), CURLFORM_END); string szName = CStringFun::wstring_to_string(gZJHome->m_project->m_name.GetBuffer()); m_project->m_name.ReleaseBuffer(); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "fileName" , CURLFORM_COPYCONTENTS, szName.c_str(), CURLFORM_END); CString strUrl =get_post_url(purl_get_version_url); string szUrl = CStringFun::wstring_to_string(strUrl.GetBuffer(0)); strUrl.ReleaseBuffer(); curl_easy_setopt(curl, CURLOPT_URL, szUrl.c_str()); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &DealReqReply); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); CURLcode res = curl_easy_perform(curl); curl_formfree(formpost); curl_easy_cleanup(curl); fclose (fp); if (res == CURLE_OK) { bRet = TRUE; } return bRet; } size_t CDlgXXXX::DealReqReply( void *buffer, size_t size, size_t nmemb, void *userp) { FILE *fp = ( FILE *)userp; size_t return_size = fwrite (buffer, size, nmemb, fp); return return_size; } |
使用
void CDlgXXXX::OnBnClickedDown() { CString strName = m_project->m_name; strName.Replace(_T(":"), _T("-")); strName.Replace(_T("/"), _T("-")); CFileDialog dlg(FALSE, _T("*.xls"), strName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Excel Files (*.xls)|*.xls||")); if(dlg.DoModal() == IDOK) { CWaitCursor cur; m_btn_down_.EnableWindow(FALSE); CString strLocalFile = dlg.GetPathName(); BOOL bRet = CurlDownloadFile(strLocalFile); if (bRet) { ShellExecute(NULL, _T("open"), dlg.GetFolderPath(), NULL, NULL, SW_SHOWNORMAL); } else { CString strUrl = get_post_url(purl_get_version_url); CString strPrama; strPrama.Format(_T("?programId=%d&orgCode=%s&fileName=%s"), m_id , get_torg_code(), m_name); ShellExecute(NULL, _T("open"), strUrl + strPrama, NULL, NULL, SW_SHOWNORMAL); } m_btn_down_.EnableWindow(TRUE); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现