C++ 将文件发送到HTTP服务器(C+;+;Wininet)

C++ 将文件发送到HTTP服务器(C+;+;Wininet),c++,wininet,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 = "filena

我有在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,"\n\n");
 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,"\r\n\r\n");
 strcat(data,"username");
 strcat(data,"\r\n");
 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;
}
#包括
#定义BUF_尺寸4096
void\uu fastcall TForm1::Button1Click(TObject*发送方)
{
TStringList*list=新的TStringList();
AnsiString路径=”;
if(OpenDialog1->Execute()){
Path=“filename=\”+OpenDialog1->filename+“\”;
列表->加载文件(OpenDialog1->文件名);
}
字符数据[BUF_大小]=“”;
静态字符hdrs[]=“内容类型:多部分/表单数据;边界=------------------------------------7d82751e2bc0858”;
strcat(数据“------------------------------------7d82751e2bc0858”);
strcat(数据,“\n”);
strcat(数据,“内容配置:表单数据;名称=\“文件[]\”;”);
strcat(data,Path.c_str());
strcat(数据,“\n”);
strcat(数据,“内容类型:应用程序/八位字节流”);
strcat(数据,“\n\n”);
strcat(数据,列表->Text.c_str());
strcat(数据,“\n”);
strcat(数据“------------------------------------7d82751e2bc0858”);
strcat(数据,“\n”);
strcat(数据,“内容配置:表单数据;名称=\“用户\”);
strcat(数据,“\r\n\r\n”);
strcat(数据,“用户名”);
strcat(数据,“\r\n”);
strcat(数据“------------------------------------7d82751e2bc0858”);
strcat(数据,“\n”);
HINTERNET hSession=互联网开放(“MyAgent”,互联网开放类型,空,空,0);
HINTERNET hConnect=InternetConnect(会话,“本地主机”,INTERNET\u默认\u HTTP\u端口,NULL,NULL,INTERNET\u服务\u HTTP,0,1);
HINTERNET hRequest=HttpOpenRequest(hConnect,“POST”,“new_upltest.php”,NULL,NULL,NULL,0,1);
HttpSendRequest(hRequest、hdrs、strlen(hdrs)、数据、strlen(数据));
删除名单;
}
它工作正常,但现在我需要上传大文件(超过70-100MB),可以是图像(.jpg、.png、.bmp)和其他文档类型(.pdf、.docx等)

可以用这个代码解决我的任务吗?我将非常感谢每一个建议


<强> P.S.我的IDE是C++ Builder 6,但我认为没关系。

< P>这是一个文件上传的工作示例:

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    = "------qwerty\r\n"
                      "Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n"
                      "------qwerty\r\n"
                      "Content-Disposition: form-data; name=\"files[]\"; filename=\"%s\"\r\n"
                      "Content-Type: application/octet-stream\r\n"
                      "Content-Transfer-Encoding: binary\r\n\r\n";
    PCHAR szDataEnd = "\r\n------qwerty--\r\n";
    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);
}

这是一个文件上载的工作示例:

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    = "------qwerty\r\n"
                      "Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n"
                      "------qwerty\r\n"
                      "Content-Disposition: form-data; name=\"files[]\"; filename=\"%s\"\r\n"
                      "Content-Type: application/octet-stream\r\n"
                      "Content-Transfer-Encoding: binary\r\n\r\n";
    PCHAR szDataEnd = "\r\n------qwerty--\r\n";
    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);
}

如果你用C++编程,为什么不使用<代码> STD::String “数据”?或者使用
std::ostringstream
进行格式化?为什么要动态分配
list
,而不是将其定义为一个简单的对象实例?@Someprogrammerdude,问题中的IDE将回答您所有的问题:)2002年facepalm的编译器。嗯,至少比TurboC++3更新。看来你的学习材料已经非常过时了。你应该得到一本好的,现代的C++书籍。读你的评论很有趣,但是我真的需要用WiNET上传文件。(不是Indy等)如果你在C++中编程,为什么不使用<代码> STD::String “数据”?或者使用
std::ostringstream
进行格式化?为什么要动态分配
list
,而不是将其定义为一个简单的对象实例?@Someprogrammerdude,问题中的IDE将回答您所有的问题:)2002年facepalm的编译器。嗯,至少比TurboC++3更新。看来你的学习材料已经非常过时了。你应该得到一本好的,现代的C++书籍。读你的评论很有趣,但是我真的需要用WiNET上传文件。(不是Indy等等)你能编辑并添加示例函数调用吗?我不能确定什么是szparam和szvalue。你能编辑并添加示例函数调用吗?我不能确定什么是szparam和szvalue