C++下载IE缓存大文件
方式一、原来用
ShellExecute
直接打开浏览器的方式,可以直接下载缓存中的文件
可是不能用于UI交互,而且用户能看到url地址
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,可以下载缓存,可以下载具体路径的
类中声明 BOOL CurlDownloadFile(CString strLocalFile); static size_t DealReqReply(void *buffer, size_t size, size_t nmemb, void *userp); //下载文件数据接收函数 回调函数需要是static或者全局函数
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); } }

浙公网安备 33010602011771号