http上传文件流程 使用winlnet

  • Post author:
  • Post category:其他


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



版权声明:本文为qq_38409301原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。