崖高人远 2016-07-19 02:48 采纳率: 81.8%
浏览 1171
已结题

wininet上传的代码怎么获取服务器返回的状态

void UploadFile(std::wstring strServer,WORD wPort,std::wstring strObject,std::wstring strFilePath,std::wstring strNewFilePath)
{
HINTERNET hSession = 0;
HINTERNET hConnect = 0;
HINTERNET hRequest = 0;

DWORD dwNumberOfBytesWritten = 0;
DWORD dwBytesSend = 0;


INTERNET_BUFFERS BufferIn;

DWORD dwFlag;

LPCTSTR boundary = _T("-----------------------------67491722032265"); //随机字符串   最好随机生成,够长的随机字符串
LPCSTR aboundary = "-----------------------------67491722032265"; //ansi

HANDLE hFile;
hFile = CreateFile(strFilePath.c_str(),
    GENERIC_READ,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    0,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

DWORD dwFileSize = GetFileSize(hFile, 0);


TCHAR content_type[128];
_stprintf_s(content_type, TEXT("Content-Type: multipart/form-data; boundary=%s"), boundary);
LPTSTR referer = TEXT("Referer: http://211.149.160.175/cl/CLUpdateFile.ashx?appKey=md5|AAA|12345678|date");        //2016年7月15日17:58:47,Referer是?
LPTSTR accept = TEXT("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
LPTSTR accept_lan = TEXT("Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
LPTSTR accept_encoding = TEXT("Accept-Encoding: gzip, deflate");
LPTSTR user_agent = TEXT("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");


hSession = InternetOpenW(_T("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0"),          //用户代理的http协议
    INTERNET_OPEN_TYPE_PRECONFIG,
    0,
    INTERNET_INVALID_PORT_NUMBER,
    0);
if (0 == hSession)
{

    return;
}

hConnect = InternetConnectW(hSession,
    strServer.c_str(),
    wPort,
    _T(""),
    _T(""),
    INTERNET_SERVICE_HTTP,
    0,
    0);
if (0 == hConnect)
{

    InternetCloseHandle(hSession);
    return;
}



dwFlag = INTERNET_FLAG_KEEP_CONNECTION;

hRequest = HttpOpenRequestW(hConnect,
    _T("POST"),
    strObject.c_str(),
    HTTP_VERSIONW,
    0,                //Referrer
    0,                //AcceptTypes 
    dwFlag,
    0);
if (0 == hRequest)
{

    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    return;
}

HttpAddRequestHeaders(hRequest, content_type, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, referer, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, accept, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, accept_lan, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, accept_encoding, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);

BYTE* lpBuffer = (BYTE*)VirtualAlloc(0, dwFileSize, MEM_COMMIT, PAGE_READWRITE);
if (0 == lpBuffer)
{
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    return;
}

DWORD dwRead;
ReadFile(hFile, lpBuffer, dwFileSize, &dwRead, 0);

CloseHandle(hFile);



char first_boundary[128];
char delimiter[128];
char end_boundary[128];
sprintf_s(first_boundary, "--%s\r\n", aboundary);
sprintf_s(delimiter, "\r\n--%s\r\n", aboundary);
sprintf_s(end_boundary, "\r\n--%s--\r\n", aboundary);

char content_dispos[128] = {0};
std::string sNewPath;
USES_CONVERSION;
sNewPath = W2A(strNewFilePath.c_str());
sprintf_s(content_dispos, "Content-Disposition: form-data; name=\"fileupload\"; filename=\"%s\"\r\n", sNewPath.c_str());  //2016年7月15日18:17:14,name是?
LPSTR content_type2 = "Content-Type: application/octet-stream\r\n\r\n";


LPSTR rn = "\r\n";

BufferIn.dwStructSize = sizeof(INTERNET_BUFFERS);
BufferIn.Next = NULL;
BufferIn.lpcszHeader = NULL;
BufferIn.dwHeadersLength = 0;
BufferIn.dwHeadersTotal = 0;
BufferIn.lpvBuffer = NULL;
BufferIn.dwBufferLength = 0;
BufferIn.dwBufferTotal = dwFileSize
    + strlen(first_boundary)
    + strlen(content_dispos)
    + strlen(content_type2)
    + strlen(end_boundary); //Content-Length:
BufferIn.dwOffsetLow = 0;
BufferIn.dwOffsetHigh = 0;

if (!HttpSendRequestEx(hRequest, &BufferIn, 0, 0, 0))
{
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    return;
}

InternetWriteFile(hRequest, (byte*)first_boundary, strlen(first_boundary), &dwNumberOfBytesWritten); //first boundary
InternetWriteFile(hRequest, (byte*)content_dispos, strlen(content_dispos), &dwNumberOfBytesWritten);
InternetWriteFile(hRequest, (byte*)content_type2, strlen(content_type2), &dwNumberOfBytesWritten);
InternetWriteFile(hRequest, lpBuffer, dwFileSize, &dwNumberOfBytesWritten);

//如果还有其他文件
//InternetWriteFile(hRequest,(byte*)delimiter,strlen(delimiter),&dwNumberOfBytesWritten); //deimiter
//InternetWriteFile(hRequest,(byte*)content_dispos,strlen(content_dispos),&dwNumberOfBytesWritten);
//InternetWriteFile(hRequest,(byte*)content_type2,strlen(content_type2),&dwNumberOfBytesWritten);
//...

InternetWriteFile(hRequest, (byte*)end_boundary, strlen(end_boundary), &dwNumberOfBytesWritten);//last boundary



HttpEndRequest(hRequest, 0, 0, 0);



InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);


//DWORD dwStatusCode;
//DWORD dwSize = sizeof(DWORD);
//BOOL bRet = HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
//  &dwStatusCode, &dwSize, NULL);

VirtualFree(lpBuffer, 0, MEM_RELEASE);

}

请问这段代码里,那个地方来获取状态码?
怎么获取?

  • 写回答

1条回答 默认 最新

  • Eleven 2016-07-19 03:10
    关注

    用下面的代码试试:

    BOOL b = HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF | HTTP_QUERY_FLAG_REQUEST_HEADERS, pHeadData, &dwLen, NULL);

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog