2010-06-14 7 views
0

Win32, Wininet을 사용하여 Flickr.I 이미지를 업로드하는 VC++에서 응용 프로그램을 만들고 있습니다. Frob, Token을 올바르게 가져올 수 있지만 이미지를 업로드하려고 할 때 오류가납니다. 크기 너무 큰.C에서 깜박일 이미지 업로드

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; 
        } 
       } 
     } 

    } 

내가 곧 길이 요 내가 문자열에 이미지 데이터를 추가하고 게시하고 꽤 확실하지 않다 다음과 같이 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; 
    } 

콘텐츠 생성 다음과 같이

헤더 생성 의뢰. 이미지 데이터를 유니 코드로 변환해야합니까? 다른 사람이 내가 잘못하고있는 것을 찾을 수 있다면 어떤 제안이라도 나에게 도움이 될 것입니다.

답변

0

실제로 게시 내용을 유니 코드로 보낼 수 없습니다. Wininet API에서 헤더를 유니 코드로 사용할 수 있습니다.

char * 버퍼에서 이미지 데이터를 읽은 다음 해당 버퍼를 게시물 내용 문자열에 추가 한 다음 마지막 줄의 내용을 추가 할 수 있습니다.