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);        
    }    
}
原文地址:https://www.cnblogs.com/XiHua/p/13889316.html