#include "Upload.h"
#include <io.h>
CUpload::CUpload(void)
{
m_uploadCourse = -1;
m_nConnectTimeOut = 0;
m_nTimeOut = 0;
curl_global_init (CURL_GLOBAL_ALL);
for(int i=0; i<MAXWORK; i++)
{
memset(m_uploadWork->url, 0, 512);
memset(m_uploadWork->filePath, 0, 256);
}
m_curIndex = 0;
}
CUpload::~CUpload(void)
{
curl_global_cleanup();
}
int CUpload::debugFun(CURL* curl, curl_infotype type, char* str, size_t len, void* stream)
{
//只打印CURLINFO_TEXT类型的信息
// if(type == CURLINFO_TEXT)
{
fwrite(str, 1, len, (FILE*)stream);
}
return 0;
}
/* parse headers for Content-Length */
size_t CUpload::GetContentLengthFunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
int r;
long len = 0;
r = sscanf((const char*)ptr, "Content-Length: %ld\n", &len);
if (r) /* Microsoft: we don't read the specs */
*((long *) stream) = len;
return size * nmemb;
}
size_t CUpload::WriteFunc(char *str, size_t size, size_t nmemb, void *stream)
{
return fwrite(str, size, nmemb, (FILE*)stream);
}
//重写把数据读入上传数据流函数
/*
size_t CUpload::ReadFunc(void* buff, size_t size, size_t nmemb, void* userp)
{
size_t sizes = fread(buff, size, nmemb, (FILE *)userp);
return sizes;
}
*/
/* read data to upload */
size_t CUpload::ReadFunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
FILE *f = (FILE*)stream;
size_t n;
if (ferror(f))
return CURL_READFUNC_ABORT;
n = fread(ptr, size, nmemb, f) * size;
return n;
}
size_t CUpload::ProgressFunc(
double* pFileLen,
double t,// 下载时总大小
double d, // 已经下载大小
double ultotal, // 上传是总大小
double ulnow) // 已经上传大小
{
if(t == 0) return 0;
//*pFileLen = d;
*pFileLen - ulnow;
return 0;
}
int CUpload::StartUploadThread()
{
if(m_uploadCourse == -1||m_uploadCourse == 1)
{
HANDLE uploadThread = CreateThread(NULL, 0, SingleUploadProc, this, 0, NULL);
CloseHandle(uploadThread);
return 0;
}
return -1;
}
double CUpload::GetTotalFileLenth( const char* url )
{
char mUrl[512] = {0};
strcpy(mUrl, url);
double uploadFileLenth = 0;
CURL* pCurl = curl_easy_init();
curl_easy_setopt(pCurl, CURLOPT_URL, mUrl);
curl_easy_setopt(pCurl, CURLOPT_HEADER, 1L);
curl_easy_setopt(pCurl, CURLOPT_NOBODY, 1L);
curl_easy_setopt(pCurl, CURLOPT_PROXY, "127.0.0.1:8888");
if(curl_easy_perform(pCurl) == CURLE_OK)
{
//curl_easy_getinfo(pCurl, CURLINFO_CONTENT_LENGTH_UPLOAD, &uploadFileLenth);
curl_easy_getinfo(pCurl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &uploadFileLenth);
}
else
{
uploadFileLenth = -1;
}
curl_easy_cleanup(pCurl);
return uploadFileLenth;
}
long CUpload::GetLocalFileLenth( const char* fileName )
{
if(m_uploadCourse == 0) //文件已经开始下载的时候,取到的是下载前本地文件的大小;
return m_curLocalFileLenth;
char strTemp[256] = {0};
strcpy(strTemp,fileName);
FILE* fp = fopen(strTemp, "rb");
if(fp != NULL)
{
m_curLocalFileLenth = filelength(fileno(fp));
fclose(fp);
return m_curLocalFileLenth;
}
return 0;
}
void CUpload::GetFileNameFormUrl( char* fileName, const char* url )
{
int urlLen = strlen(url);
char mUrl[512] = {0};
char fName[256] = {0};
strcpy(mUrl, url);
int cutIndex = 0;
int i = urlLen - 1, j = 0;
while(mUrl[--i] != '\\');
i++;
while(mUrl[i] != '\0' && mUrl[i] != '?' &&mUrl[i] != '&')
{
fName[j++] = mUrl[i++];
}
fName[j] = '\0';
strcpy(fileName, fName);
return ;
}
void CUpload::AddUploadWork( ULIO uploadWork )
{
char filePath[256] = {0};
char mUrl[512] = {0};
strcpy(mUrl, uploadWork.url);
strcpy(filePath, uploadWork.filePath);
int i = strlen(filePath) -1;
BOOL isPath = TRUE;
while(filePath[i] != '\\')
{
if(filePath[i] == '.' && filePath[i+1] != '\0')
{
isPath = FALSE;
}
i--;
}
if(isPath)
{
}
strcpy(m_uploadWork[m_curIndex].url, mUrl);
strcpy(m_uploadWork[m_curIndex].filePath, filePath);
/////add by cheny
//真充 urlFile
char urlFile[512] = {0};
strcpy(urlFile, mUrl);
strcat(urlFile, "?uri=file:///");
char cName[256] = {0};
GetFileNameFormUrl(cName, filePath);
strcpy(m_uploadWork[m_curIndex].fileName, cName);
strcat(urlFile, cName);
strcpy(m_uploadWork[m_curIndex].urlFile, urlFile);
////add end
m_curIndex++;
}
int CUpload::SetConnectTimeOut( DWORD nConnectTimeOut )
{
if(m_uploadCourse == 0) return -1;
else
m_nConnectTimeOut = nConnectTimeOut;
return 0;
}
int CUpload::SetTimeOut( DWORD nTimeOut )
{
if(m_uploadCourse == 0) return -1;
else
m_nTimeOut = nTimeOut;
return 0;
}
int CUpload::GetCurrentUploadInfo( CURUI* lpCurUploadInfor )
{
*lpCurUploadInfor = m_curUploadInfo;
return 0;
}
BOOL CUpload::CreateMultiDir( const char* pathName )
{
return FALSE;
}
BOOL CUpload::IsUploadBegin()
{
if(m_uploadCourse == 0)
return TRUE;
return FALSE;
}
BOOL CUpload::IsUploadEnd()
{
if(m_uploadCourse == 1)
return TRUE;
return FALSE;
}
DWORD WINAPI CUpload::SingleUploadProc(LPVOID lpParameter)
{
CUpload* pUp= (CUpload*)lpParameter;
int curDLIndex = 0;
CURL* pCurl = curl_easy_init();
struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL;
while(curDLIndex < pUp->m_curIndex)
{
char fileName[256] = {0};
char url[512] = {0};
//下面两句是取到urlFile,让GetTotalFileLenth函数调用
char urlFile[512] = {0};
strcpy(urlFile, pUp->m_uploadWork[curDLIndex].urlFile);
strcpy(fileName, pUp->m_uploadWork[curDLIndex].filePath);
strcpy(url, pUp->m_uploadWork[curDLIndex].url);
strcpy(pUp->m_curUploadInfo.url, url);
strcpy(pUp->m_curUploadInfo.fileName, fileName);
long localFileLen = pUp->GetLocalFileLenth(fileName);
pUp->m_curLocalFileLenth = localFileLen;
pUp->m_curUploadInfo.preLocalLen = pUp->m_curLocalFileLenth;
double totalFileLen = pUp->m_curUploadInfo.totalFileLen = pUp->GetTotalFileLenth(urlFile);
//如果上传的文件大小大于等于本地文件的大小,说明服务端已经存在这个文件了,则上传下一个文件
if(totalFileLen >= (long)localFileLen)
{
curDLIndex++;
pUp->m_uploadCourse = -1;
continue;
}
long uploaded_len = 0;
FILE* fp = fopen(fileName,"rb");
if(fp == NULL) //文件打开错误,进行下一个文件的上传
{
pUp->m_uploadCourse = -1;
continue;
}
//从指定的大小处开始上传
//fseek(fp, totalFileLen, SEEK_SET);
//uploaded_len = localFileLen - totalFileLen;
uploaded_len = localFileLen;
//获取文件大小
// fseek(fp, 0, 2);
// int file_size = ftell(fp);
// rewind(fp);
//移位到上传的大小这里
//将相关的调试信息打印到dubugFile.txt中
FILE *debugFile = NULL;
if(NULL == (debugFile = fopen("debugFile.txt", "a+")))
return -1;
/* Fill in the file upload field */
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "upload",
//CURLFORM_FILE, "C:\\upload1\\22.txt",
CURLFORM_FILE, "C:\\upload1\\222.exe",
CURLFORM_END);
/* Fill in the filename field */
// curl_formadd(&formpost,
// &lastptr,
// CURLFORM_COPYNAME, "filename",
// CURLFORM_COPYCONTENTS, "C:\\upload1\\22.txt",
// CURLFORM_END);
/* Fill in the submit field too, even if this is rarely needed */
// curl_formadd(&formpost,
// &lastptr,
// CURLFORM_COPYNAME, "submit",
// CURLFORM_COPYCONTENTS, "send",
// CURLFORM_END);
curl_easy_setopt(pCurl, CURLOPT_URL, url);
//curl_easy_setopt(pCurl, CURLOPT_UPLOAD, 1L); //告诉easy_handle是做上传操作
//curl_easy_setopt(pCurl, CURLOPT_PUT, 1L);
/* Now specify we want to POST data */
curl_easy_setopt(pCurl, CURLOPT_POST, 1L);
curl_easy_setopt(pCurl, CURLOPT_PROXY, "127.0.0.1:8888");
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, pUp->m_nTimeOut);
curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, pUp->m_nConnectTimeOut);
//curl_eas