您的位置:首页 > 理论基础 > 计算机网络

HTTP POST上传文件代码实现

2014-09-12 23:18 295 查看
void UploadFile(LPTSTR lpFilePath)

{

HINTERNET hSession=0;

HINTERNET hConnect=0;

HINTERNET hRequest=0;



DWORD dwNumberOfBytesWritten=0;

DWORD dwBytesSend=0;



INTERNET_BUFFERS BufferIn;

DWORD dwFlag;

LPCTSTR boundary=TEXT("-----------------------------67491722032265"); //随机字符串

LPCSTR aboundary="-----------------------------67491722032265"; //ansi

HANDLE hFile;

hFile=CreateFile(lpFilePath,

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://127.0.0.1/upload/~upload");
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=InternetOpen(_T("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0"),

INTERNET_OPEN_TYPE_PRECONFIG,

0,

INTERNET_INVALID_PORT_NUMBER,

0);

if (0==hSession)

{

return;

}



hConnect=InternetConnect(hSession,

TEXT("172.16.1.142"),

80,

_T(""),

_T(""),

INTERNET_SERVICE_HTTP,

0,

0);

if (0==hConnect)

{

InternetCloseHandle(hSession);

return;

}

dwFlag=INTERNET_FLAG_KEEP_CONNECTION;

hRequest=HttpOpenRequest(hConnect,

_T("POST"),

_T("/upload/"),

HTTP_VERSION,

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

LPSTR content_dispos="Content-Disposition: form-data; name=\"fileupload1\"; filename=\"notepad.exe\"\r\n";



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

VirtualFree(lpBuffer,0,MEM_RELEASE);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: