本帖最后由 linuxredhat001 于 2010-07-29 18:05:54 编辑

解决方案 »

  1.   

    我这里有个以前的程序的部分代码,没有问题,multipart部分的难度主要是要仔细,空格,尤其是空行不能缺少。
    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';