代码之家  ›  专栏  ›  技术社区  ›  anand

在C++中将图像上传到闪烁

  •  0
  • anand  · 技术社区  · 15 年前

    我正在使用win32,wininet在vc++中创建一个应用程序来将图像上载到flickr。我能够正确地获取frob,token,但是当我尝试上载图像时,我得到的错误后大小太大。

    标题创建如下

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

    Post请求的内容创建如下:

    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? 如果有人能发现我做错了什么,任何建议都会对我很有帮助。

    1 回复  |  直到 15 年前
        1
  •  0
  •   anand    15 年前

    实际上,我们不能以Unicode格式发送文章内容。 我们可以在wininet apis中使用头文件作为unicode。

    一旦我们在char*缓冲区中读取了图像数据,我们就可以将该缓冲区添加到post-content字符串中,然后添加最后一行内容。