std::string g_strVer = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1";
size_t CallBackHeader(void* pStr,size_t tSize,size_t tNumber,void* pUserData)
{
size_t tLen = tSize*tNumber;
CHttpCurlDlg* pThis = (CHttpCurlDlg*)pUserData;
(&(pThis->m_strHeader))->append((const char*)pStr,tLen);
return tLen;
}
size_t CallBackReadFun(void *pStr,size_t tSize,size_t tNumber,void* pUserData)
{
size_t tLen = 0;
tLen = fread(pStr,tSize,tNumber,(FILE*)pUserData);
return tLen;
}
size_t CallBackProgress(void* pUserData,double dTotalDown,double dNowDown,double dTotalUpLoad,double dNowUpLoaded)
{
size_t tFlag = 0;
double dProg = (dNowUpLoaded*100)/dTotalUpLoad;
return tFlag;
}
size_t CallBack_WriteFun(void* ptr, size_t size, size_t nmemb, void *stream)
{
assert(stream != NULL);
size_t len = size * nmemb;
CHttpCurlDlg* pThis = (CHttpCurlDlg*)stream;
std::string strContext = "";
strContext.append((char*)ptr, len);
long retcode = 0;
CURLcode cCode = curl_easy_getinfo(pThis->m_pCurl, CURLINFO_RESPONSE_CODE , &retcode);
size_t written = -1;
if ( (cCode == CURLE_OK) && retcode == 200 )
{
written = fwrite(ptr, size, nmemb, pThis->m_fpFileHandle);
}
return written;
}
void FTPUPload()
{
// TODO: 在此添加控件通知处理程序代码
CURL* pCurl = NULL;
CURLcode cCode;
std::string strURL = "ftp://10.20.8.162:9000/upload/ZIP/codebackup.zip";
cCode = curl_global_init(CURL_GLOBAL_WIN32);
FILE *fp = fopen("D:\\ReadyToUpload\\codebackup.zip", "rb");
fseek(fp, 0, 2);
curl_off_t file_size = ftell(fp);
rewind(fp);
int nTimeOut = 4500;
pCurl = curl_easy_init();
// 设置属性
curl_easy_setopt(pCurl, CURLOPT_URL, strURL.c_str());
curl_easy_setopt(pCurl,CURLOPT_USERAGENT,g_strVer.c_str());
curl_easy_setopt(pCurl, CURLOPT_UPLOAD, 1L);
//设置读取内容到上传缓冲区的回调函数
curl_easy_setopt(pCurl, CURLOPT_READFUNCTION,CallBackReadFun);
curl_easy_setopt(pCurl, CURLOPT_READDATA, fp);
//若目录不存在则让ftp创建
curl_easy_setopt(pCurl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
//CURLOPT_INFILESIZE一般协议第三个参数为long类型
//curl_easy_setopt(pCurl, CURLOPT_INFILESIZE, file_size);
//CURLOPT_INFILESIZE_LARGE为soap协议必须设定的参数,传入第三个参数类型为curl_off_t
curl_easy_setopt(pCurl, CURLOPT_INFILESIZE_LARGE, file_size);
//设置帐号密码(如果需要)
//curl_easy_setopt(pCurl, CURLOPT_USERPWD, "lionel:lionel007");
//连接超时设置
//curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, nTimeOut);
//设置头处理函数
//curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, CallBackHeader);
//curl_easy_setopt(pCurl, CURLOPT_HEADERDATA, &strBuffer);
// 设置断点续传
//curl_easy_setopt(pCurl, CURLOPT_RESUME_FROM_LARGE, bIfBreak?Len1:len2);
//上传进度回调函数
curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(pCurl, CURLOPT_PROGRESSFUNCTION, CallBackProgress); //上传进度回调方法
curl_easy_setopt(pCurl, CURLOPT_PROGRESSDATA, this);
// 执行上传操作
cCode = curl_easy_perform(pCurl);
if (cCode == CURLE_OK)
{
}
fclose(fp);
curl_easy_cleanup(pCurl);
curl_global_cleanup();
}