将图像上传到c ++中的闪烁

Posted

技术标签:

【中文标题】将图像上传到c ++中的闪烁【英文标题】:Uploading image to flicker in c++ 【发布时间】:2010-06-14 15:44:20 【问题描述】:

我正在使用 win32、wininet 在 VC++ 中创建一个应用程序以将图像上传到 Flickr。我能够正确获取 Frob、Token 但是当我尝试上传图像时出现错误 Post size too large。

标题创建如下

 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】:

实际上我们不能以 unicode 形式发送 Post 内容。 我们可以在 Wininet API 中使用标头作为 unicode。

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

【讨论】:

以上是关于将图像上传到c ++中的闪烁的主要内容,如果未能解决你的问题,请参考以下文章

将图像上传到 iOS Objective C 中的 AWS EC2 服务器

图像未通过目标 C 中的 POST 上传到服务器

使用多方将图像从 ipad 应用程序上传到节点 js 服务器

将图像上传到ios中的Web服务

将多个图像上传到队列中的服务器

如何将图像上传到firebase存储然后将图像url存储在firestore中?