CloseHandle(hFile); DWORD dwErrCode =::GetLastError(); throw WinErrorException(dwErrCode, L"HttpSendRequestEx failed"); } //first: write the description part. DWORD dwBytesRead =0; DWORD dwBytesWritten=0; InternetWriteFile(hRequest,szDescBody, sizeOfDescBody-1 , &dwBytesWritten); //write the content of the file CHAR szReadBuf[BUFFERSIZE]; ZeroMemory(szReadBuf, sizeof(szReadBuf)); SetFilePointer(hFile, 0, NULL, FILE_BEGIN); //SET the file pointer position to the start of the file
//variables used to setup the progress dialog INT64 lStartTimeStamp = HelperFunctions::GetCurrentTimeStamp(); int nBlockNum =0; int nSpeed =0;
do { if (g_bUserCanceled) { InternetCloseHandle(hRequest); CloseHandle(hFile); return ; }
void ShareAPI::doUpload( LPCWSTR lpszFileFullPathName, LPCWSTR lpszFolderNodeId, LPCWSTR lpszDescription, HWND hMsg, BOOL isRetry, CHAR* szResponse)
{
HANDLE hFile = CreateFile(lpszFileFullPathName, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
NULL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
throw runtime_error("open file failed!");
} //get the filename from file full path
WCHAR lpszFileName[MAX_PATH];
HelperFunctions::GetFileNameFromFilePath(lpszFileFullPathName, lpszFileName, MAX_PATH); if (isRetry) //original file name is illegal , add ".wjh"
{
wcscat_s(lpszFileName, MAX_PATH, L".wjh");
} //boundary string
LPCWSTR lpszBoundary = L"a4bxyef8934324sdfsdfs066"; WCHAR szRequestPath[LEN_URLFULLPATH]=L"";
wcscpy_s(szRequestPath, SHARE_URLDC);
//if the folerNodeId is NULL , user SHAR_URLDC
if (lpszFolderNodeId && wcslen(lpszFolderNodeId) >0)
{
wcscat_s(szRequestPath, lpszFolderNodeId);
if (lpszFolderNodeId[wcslen(lpszFolderNodeId)-2] != L'/')
wcscat_s(szRequestPath, L"/");
}
//open Request
HINTERNET hRequest = HttpOpenRequestW(m_hConnect, L"POST", szRequestPath, NULL,NULL,NULL, INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_SECURE,0);
if(!hRequest)
{
DWORD dwErrCode =::GetLastError();
throw WinErrorException(dwErrCode, L"UploadFile failed in HttpOpenRequest()");
}
//add header
WCHAR szHeader[256];
wcscpy_s(szHeader,L"Content-Type:multipart/form-data; boundary=\"");
wcscat_s(szHeader, lpszBoundary);
wcscat_s(szHeader,L"\"\r\n");
HttpAddRequestHeadersW(hRequest, szHeader, wcslen(szHeader), HTTP_ADDREQ_FLAG_REPLACE|HTTP_ADDREQ_FLAG_ADD);
WCHAR szAuthHeader[LEN_AUTHHEADER]=L"";
generateAuthorizationHeader( L"POST", szRequestPath, szAuthHeader);
if (!HttpAddRequestHeadersW(hRequest,szAuthHeader, -1L, HTTP_ADDREQ_FLAG_ADD))
{
DWORD dwErrCode = GetLastError();
throw WinErrorException(dwErrCode, L" add authentication header failed !");
}
//add body
WCHAR szDescBodyWide[1024] =L"";
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"--");
wcscat_s(szDescBodyWide, lpszBoundary);
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"Content-Disposition: form-data; name=\"request\"");
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"Content-Type:application/xml;charset=UTF-8\r\n");
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"<request>");
wcscat_s(szDescBodyWide, L"<file>");
wcscat_s(szDescBodyWide, L"<createpdf>false</createpdf>");
wcscat_s(szDescBodyWide, L"<name>");
wcscat_s(szDescBodyWide, lpszFileName);
wcscat_s(szDescBodyWide, L"</name>");
wcscat_s(szDescBodyWide, L"<description>");
if (lpszDescription && wcslen(lpszDescription)>0)
wcscat_s(szDescBodyWide, lpszDescription);
wcscat_s(szDescBodyWide, L"</description>");
wcscat_s(szDescBodyWide, L"<renditions>false</renditions>");
wcscat_s(szDescBodyWide, L"</file>");
wcscat_s(szDescBodyWide, L"</request>");
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"--");
wcscat_s(szDescBodyWide, lpszBoundary);
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"Content-Disposition: form-data; name=\"file\"; filename=\"");
wcscat_s(szDescBodyWide, lpszFileName);
wcscat_s(szDescBodyWide, L"\"\r\n"); wcscat_s(szDescBodyWide, L"Content-Type: application/octet-stream");
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"Content-Transfer-Encoding: binary");
wcscat_s(szDescBodyWide, L"\r\n");
wcscat_s(szDescBodyWide, L"\r\n");
CHAR szDescBody[1024];
size_t sizeOfDescBody = WideCharToMultiByte(CP_UTF8,0,szDescBodyWide,-1,szDescBody,1024,NULL,NULL); WCHAR szEndBoundaryWide[128] =L"";
wcscat_s(szEndBoundaryWide, L"\r\n");
wcscat_s(szEndBoundaryWide, L"\r\n");
wcscat_s(szEndBoundaryWide, L"--");
wcscat_s(szEndBoundaryWide, lpszBoundary);
wcscat_s(szEndBoundaryWide, L"--");
wcscat_s(szEndBoundaryWide, L"\r\n"); CHAR szEndBoundary[128];
size_t sizeOfEndBound = WideCharToMultiByte(CP_UTF8,0,szEndBoundaryWide,-1,szEndBoundary,128,NULL,NULL); //read binary code from the file.
INTERNET_BUFFERS bufferIn;
bufferIn.dwStructSize = sizeof(INTERNET_BUFFERS);
bufferIn.Next = NULL;
bufferIn.lpcszHeader = NULL;
bufferIn.dwHeadersLength = 0;
bufferIn.dwHeadersTotal =0;
bufferIn.lpvBuffer = NULL;
bufferIn.dwBufferLength =0;
LARGE_INTEGER fileSize;
GetFileSizeEx(hFile, &fileSize);
bufferIn.dwBufferTotal = sizeOfDescBody + fileSize .QuadPart+ sizeOfEndBound-2;
bufferIn.dwOffsetLow = 0;
bufferIn.dwOffsetHigh = 0; if (!HttpSendRequestEx(hRequest, &bufferIn, NULL, 0, 0))
{
//HttpEndRequest(hRequest, NULL, 0, 0);
InternetCloseHandle(hRequest);
CloseHandle(hFile);
DWORD dwErrCode =::GetLastError();
throw WinErrorException(dwErrCode, L"HttpSendRequestEx failed");
} //first: write the description part.
DWORD dwBytesRead =0;
DWORD dwBytesWritten=0;
InternetWriteFile(hRequest,szDescBody, sizeOfDescBody-1 , &dwBytesWritten); //write the content of the file
CHAR szReadBuf[BUFFERSIZE];
ZeroMemory(szReadBuf, sizeof(szReadBuf));
SetFilePointer(hFile, 0, NULL, FILE_BEGIN); //SET the file pointer position to the start of the file
//variables used to setup the progress dialog
INT64 lStartTimeStamp = HelperFunctions::GetCurrentTimeStamp();
int nBlockNum =0;
int nSpeed =0;
do
{
if (g_bUserCanceled)
{
InternetCloseHandle(hRequest);
CloseHandle(hFile);
return ;
}
if (!ReadFile(hFile, szReadBuf, BUFFERSIZE, &dwBytesRead, NULL))
{
//HttpEndRequest(hRequest, NULL, 0,0);
InternetCloseHandle(hRequest);
CloseHandle(hFile);
DWORD dwErrCode = GetLastError();
throw WinErrorException(dwErrCode, L"ReadFile Failed");
}
else if (dwBytesRead)
{
if (InternetWriteFile(hRequest, szReadBuf, dwBytesRead, &dwBytesWritten))
{
//。。
}
else
{
InternetCloseHandle(hRequest);
//HttpEndRequest(hRequest, NULL, 0,0);
CloseHandle(hFile);
DWORD dwErrCode =::GetLastError();
throw WinErrorException(dwErrCode, L"InternetWriteFile failed");
}
}
ZeroMemory(szReadBuf, sizeof(szReadBuf));
}while (dwBytesRead==BUFFERSIZE);
InternetWriteFile(hRequest, szEndBoundary, sizeOfEndBound-1, &dwBytesWritten);
//close the file .
CloseHandle(hFile);
//end request
HttpEndRequest(hRequest, NULL, 0,0);
DWORD dwByteRead =0;
if (!InternetReadFile(hRequest, (LPVOID)szResponse, LEN_UPLOADRESPONSE, &dwByteRead))
{
DWORD dwErrCode = GetLastError();
throw WinErrorException(dwErrCode, L"Get Response XML failed");
}
szResponse[dwByteRead] ='\0';