2010-06-14 86 views
0

我創建了一個應用程序在VC + +使用win32,wininet上傳圖像到Flickr.I能夠正確得到Frob,令牌,但是當我嘗試上傳圖像時我得到錯誤發佈大小太大了。上傳圖像閃爍在c + +

頁眉創建了以下POST請求的

wstring wstrAddHeaders = L"Content-Type: multipart/form-data;boundary=ABCD\r\n"; 
    wstrAddHeaders   += L"Host: api.flickr.com\r\n"; 
    wchar_t tempStr[MAX_PATH]; 
    wsprintf(L"Content-Length: %ld\r\n",szTotalSize); 
    wstrAddHeaders   += tmpStr; 
    wstrAddHeaders +=L"\r\n"; 
HINTERNET hSession = InternetConnect(hInternet, L"www.flickr.com", INTERNET_DEFAULT_HTTP_PORT, NULL,NULL, INTERNET_SERVICE_HTTP, 0, 0);    
    if(hSession==NULL) 
    { 
     dwErr = GetLastError(); 
     return; 
    } 

內容被創建如下:

wstring wstrBoundry = L"--ABCD\r\n"; 

wstring wstrContent =wstrBoundry; 
wstrContent +=L"Content-Disposition: form-data; name=\"api_key\"\r\n\r\n"; 
wstrContent +=wstrAPIKey.c_str() ; 
wstrContent += L"\r\n"; 

wstrContent +=wstrBoundry; 
wstrContent +=L"Content-Disposition: form-data; name=\"auth_token\"\r\n\r\n"; 
wstrContent +=m_wstrToken.c_str(); 
wstrContent += L"\r\n"; 

wstrContent +=wstrBoundry; 
wstrContent +=L"Content-Disposition: form-data; name=\"api_sig\"\r\n\r\n"; 
wstrContent +=wstrSig; 
wstrContent += L"\r\n"; 

wstrContent +=wstrBoundry; 
wstrContent +=L"Content-Disposition: form-data; name=\"photo\"; filename=\"C:\\test.jpg\""; 
wstrContent +=L"\r\n"; 
wstrContent +=L"Content-Type: image/jpeg\r\n\r\n"; 

wstring wstrFilePath(L"C:\\test.jpg"); 
CAtlFile file; 

HRESULT hr = S_OK; 
hr = file.Create(wstrFilePath.c_str(),GENERIC_READ,FILE_SHARE_READ,OPEN_EXISTING); 
if(FAILED(hr)) 
{ 
    return; 
} 

ULONGLONG nLen; 
hr = file.GetSize(nLen); 

if (nLen > (DWORD)-1) 
{ 
    return ; 
} 
char * fileBuf = new char[nLen]; 
file.Read(fileBuf,nLen); 

wstring wstrLastLine(L"\r\n--ABCD--\r\n"); 

size_t szTotalSize = sizeof(wchar_t) * (wstrContent.length()) +sizeof(wchar_t) * (wstrLastLine.length()) + nLen; 
unsigned char *buffer = (unsigned char *)malloc(szTotalSize); 
memset(buffer,0,szTotalSize); 


memcpy(buffer,wstrContent.c_str(),wstrContent.length() * sizeof(wchar_t)); 
memcpy(buffer+wstrContent.length() * sizeof(wchar_t),fileBuf,nLen); 
memcpy(buffer+wstrContent.length() * sizeof(wchar_t)+nLen,wstrLastLine.c_str(),wstrLastLine.length() * sizeof(wchar_t)); 

hRequest = HttpOpenRequest(hSession, L"POST", L"/services/upload/", L"HTTP/1.1", NULL, NULL, 0, NULL); 
if(hRequest) 
{ 
    bRet = HttpAddRequestHeaders(hRequest,wstrAddHeaders.c_str(),wstrAddHeaders.length(),HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); 
    if(bRet) 
    { 
     bRet = HttpSendRequest(hRequest,NULL,0,(void *)buffer,szTotalSize); 
     if(bRet) 
     { 
      while(true)   
       { 
        char buffer[1024]={0}; 
        DWORD read=0; 
        BOOL r = InternetReadFile(hRequest,buffer,1024,&read); 
        if(read !=0) 
        { 
         wstring strUploadXML =buffer; 
         break; 
        } 
       } 
     } 

    } 

我不是很肯定的方式,我將圖像數據串並張貼請求。 我需要將圖像數據轉換爲Unicode嗎? 任何建議,如果有人可以找到我做錯了什麼,這將對我很有幫助。

回答

0

其實我們無法發送發佈內容爲unicode。 我們可以在Wininet API中使用標題作爲unicode。

一旦我們讀取char *緩衝區中的圖像數據,我們可以將該緩衝區添加到後內容字符串中,然後添加最後一行內容。