将文件发送到 HTTP 服务器 (C++ Wininet)
Sending file to HTTP server (C++ Wininet)
我有在我的HTTP服务器上上传小.txt
文件的代码:
#include <wininet.h>
#define BUF_SIZE 4096
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList * list = new TStringList();
AnsiString Path = "";
if(OpenDialog1->Execute()) {
Path = "filename=""+OpenDialog1->FileName+""";
list->LoadFromFile(OpenDialog1->FileName);
}
char data[BUF_SIZE] = "";
static char hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";
strcat(data,"-----------------------------7d82751e2bc0858");
strcat(data,"n");
strcat(data,"Content-Disposition: form-data; name="files[]"; ");
strcat(data,Path.c_str());
strcat(data,"n");
strcat(data,"Content-Type: application/octet-stream");
strcat(data,"nn");
strcat(data,list->Text.c_str());
strcat(data,"n");
strcat(data,"-----------------------------7d82751e2bc0858");
strcat(data,"n");
strcat(data,"Content-Disposition: form-data; name="user"");
strcat(data,"rnrn");
strcat(data,"username");
strcat(data,"rn");
strcat(data,"-----------------------------7d82751e2bc0858");
strcat(data,"n");
HINTERNET hSession = InternetOpen("MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, "localhost",INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "new_upltest.php", NULL, NULL, NULL, 0, 1);
HttpSendRequest(hRequest, hdrs, strlen(hdrs), data, strlen(data));
delete list;
}
它工作正常,但现在我需要上传大文件(超过 70-100 MB(,可以是图像(.jpg、.png、.bmp(和其他文档类型(.pdf、.docx等(。
是否可以使用此代码解决我的任务?我将感谢每一个建议...
附言我的 IDE C++生成器 6,但我认为这无关紧要。
这是一个文件上传的工作示例:
void http_upload_file(PCHAR szServer, PCHAR szScript, PCHAR szParam, PCHAR szValue, PCHAR szFile)
{
PCHAR szHeaders = "Content-Type: multipart/form-data; boundary=----qwerty";
PCHAR szData = "------qwertyrn"
"Content-Disposition: form-data; name="%s"rnrn%srn"
"------qwertyrn"
"Content-Disposition: form-data; name="files[]"; filename="%s"rn"
"Content-Type: application/octet-streamrn"
"Content-Transfer-Encoding: binaryrnrn";
PCHAR szDataEnd = "rn------qwerty--rn";
char szHeader[512];
HINTERNET hSession, hConnect, hRequest;
DWORD dwFileSize, dwBytesRead, dwContentLength,dwBytesWritten;
hSession = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hSession)
{
hConnect = InternetConnect(hSession, szServer, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP,0, 0);
if (hConnect)
{
hRequest = HttpOpenRequest(hConnect, "POST", szScript, NULL, NULL, 0, 0, 0);
if (hRequest)
{
HANDLE hFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
dwFileSize = GetFileSize(hFile, NULL);
wsprintf(szHeader, szData, szParam, szValue, szFile);
dwContentLength = lstrlen(szHeader) + dwFileSize + lstrlen(szDataEnd);
LPBYTE pBuf = (LPBYTE)malloc(dwContentLength);
CopyMemory(&pBuf[0], szHeader, lstrlen(szHeader));
ReadFile(hFile, &pBuf[lstrlen(szHeader)], dwFileSize, &dwBytesRead, NULL);
CopyMemory(&pBuf[lstrlen(szHeader) + dwFileSize], szDataEnd, lstrlen(szDataEnd));
HttpSendRequest(hRequest, szHeaders, lstrlen(szHeaders), pBuf, dwContentLength);
CloseHandle(hFile);
free(pBuf);
}
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hSession);
}
相关文章:
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- WinInet只下载网页的一部分
- 使用 WinInet 修改/删除 HTTP 响应标头
- Qt <winInet.h> 在构建时输出许多 C4430 和 C2146 错误
- C++ WinINET FtpPutFile 错误代码 3
- 将文件发送到 HTTP 服务器 (C++ Wininet)
- C Wininet FTP列出了许多文件错误
- 如何安全地防止在 Wininet 中调用状态回调函数
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- 通过Wininet下载数据
- Wininet未定义标识符
- Wininet 收到发送的标头
- WinInet如何使用sock代理
- 如何使用WinINet查找是否存在网页
- 如何与多个线程正确连接Wininet
- WinInet输出中的随机字符
- 在c++中使用wininet时发生链接器错误
- 如何在Wininet中使用C++中的HTTPPOST
- C++ WinINet InternetReadFile 函数刷新
- WinINet API可以在Windows Server OS上使用吗?