http上传文件步骤
使用Wininet API上传文件到Web Server。它分为客户端和服务端两块,客户端负责连接服务器,发送数据给服务端;服务端负责接收数据,保存。
客户端:
URL的组成:举个例子:
http://myWebServer:8080/Handler/FileUploader.aspx
“myWebServer”为Server Host Name,它用来表示服务器的IP地址。
“8080”是该服务器对http开发的端口号,默认为80,https 默认端口143
“/Handler/FileUploader.aspx”就是这个URL的UrlPath了
1. 用 InternetOpen 创建一个表示该次连接的Internet句柄
HINTERNET hSession = InternetOpen(_T(“WinInetGet/0.1”), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);
2.用 InternetConnect 与指定服务器连接,获得本次连接句柄
//nPort:端口
HINTERNET hConnection = ::InternetConnect(hSession, szServerHostName, nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
3. 用HttpOpenRequest向服务器发送请求
HINTERNET hRequest = ::HttpOpenRequest(hConnection, _T(“POST”), szUrlPath, “HTTP/1.1”,NULL, NULL, NTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_RELOAD,NULL);
4.用HttpSendRequestEx向服务器上传文件请求
INTERNET_BUFFERS BufferIn;
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 = dwUploadDataSize
+ strlen(first_boundary)
+ strlen(strPostData.c_str())
+ strlen(end_boundary);
BufferIn.dwOffsetLow = 0;
BufferIn.dwOffsetHigh = 0;
if (!HttpSendRequestEx(hRequest, &BufferIn, 0, 0, 0)){};
5.用InternetWriteFile传送数据,传送文件的话,需要将文件数据不断读取到buffer里,并用InternetWriteFile发送出去。
DWORD dwNumberOfBytesWritten(0);
if(!::InternetWriteFile(hRequest, (void*)first_boundary, strlen(first_boundary), &dwNumberOfBytesWritten) ||
!::InternetWriteFile(hRequest, (void*)strPostData.c_str(), strlen(strPostData.c_str()), &dwNumberOfBytesWritten) ||
!::InternetWriteFile(hRequest, pUploadData, dwUploadDataSize, &dwNumberOfBytesWritten) ||
!::InternetWriteFile(hRequest, (void*)end_boundary, strlen(end_boundary), &dwNumberOfBytesWritten))
6.用HttpEndRequest()等待服务器处理。这个时候,客户端的执行实际上是停止在这里的,只有当服务段接受完数据,完成处理后,客户端才接着执行下去。
if (!::HttpEndRequest(hRequest, NULL, 0, 0)){};