【问题标题】:How to send to server a binary (.zip) file using Wininet如何使用 Wininet 向服务器发送二进制 (.zip) 文件
【发布时间】:2018-12-23 03:57:23
【问题描述】:

我想使用 POST 方法将文件传输到站点 在 php 站点上,脚本接受“userfile”并将其保存在服务器上

void SendFile()
{
  const char hdrs[] = "Content-Type: multipart/form-data; boundary=--------071418204214402\n"
  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

  char* data1 = "----------071418204214402\n"
  "Content-Disposition: form-data; name=\"userfile\"; filename=\"file.zip\"\n"
  "Content-Type: text/plain\n"
  "Content-Transfer-Encoding: binary\n\n";

  char* filecontent = "Hello World!";       // Simulated the contents of the file with a string.

  char* data2 = "\n----------071418204214402--\n";

  char* allstr = calloc(strlen(data1) + strlen(filecontent) + strlen(data2) + 1, 1);
  strcat(allstr, data1);
  strcat(allstr, filecontent);
  strcat(allstr, data2); 

  HINTERNET hSession = InternetOpen("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  HINTERNET hConnect = InternetConnect(hSession, "crazra94.beget.tech", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
  HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "/send.php", NULL, NULL, NULL, 0, 1);

  HttpAddRequestHeaders(hRequest, hdrs, -1, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
  INTERNET_BUFFERS bufferIn;
  LPDWORD bytesWritten;
  memset(&bufferIn, 0, sizeof(INTERNET_BUFFERS));
  bufferIn.dwStructSize = sizeof(INTERNET_BUFFERS);
  bufferIn.dwBufferTotal = strlen(data1) + strlen(filecontent) + strlen(data2)+1;
  HttpSendRequestEx(hRequest, &bufferIn, NULL, HSR_INITIATE, 0);
  InternetWriteFile(hRequest, (const void*)data1, strlen(data1)+1, bytesWritten);
  InternetWriteFile(hRequest, (const void*)filecontent, strlen(filecontent)+1, bytesWritten); // File
  InternetWriteFile(hRequest, (const void*)data2, strlen(data2)+1, bytesWritten);
  HttpEndRequest(hRequest, NULL, HSR_INITIATE, 0);
}

文件未发送(请求不正确) 可以修吗?

更新: 此代码工作正确。 但我不知道如何将二进制文件放入字符数组中。 这是用于发送文本文件:

void SendFile()

{

const unsigned char hdrs[] = "Content-Type: multipart/form-data; boundary=--------071418204214402\n"
                    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

unsigned char* data1 = "----------071418204214402\r\n"
    "Content-Disposition: form-data; name=\"userfile\"; filename=\"test2.txt\"\r\n"
    "Content-Type: text/plain\r\n"
    "Content-Transfer-Encoding: binary\r\n\r\n";

unsigned char* filecontent = "Hello World!";

unsigned char* data2 = "\r\n----------071418204214402--\r\n";

    unsigned char* allstr = calloc(strlen(data1) + strlen(filecontent) + strlen(data2) + 1, sizeof(unsigned char));
    strcat(allstr, data1);
    strcat(allstr, filecontent);
    strcat(allstr, data2); 

HINTERNET hSession = InternetOpen("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, "crazra94.beget.tech", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "/send.php", NULL, NULL, NULL, 0, 1);
HttpSendRequest(hRequest, hdrs, strlen(hdrs), allstr, strlen(allstr));

}

【问题讨论】:

  • 真实代码是否也完全错过了所有错误检查?如果是,请将其与任何合理的错误记录一起添加并重新测试。
  • 代码编译执行没有错误。但是文件没有到达服务器。如何获取最新的错误信息? (我用的是 GCC 编译器)
  • 另外,如果您使用了 C 编译器,这些转换 (const void*) 就没有必要了。你使用哪个编译器?
  • 适用于 Windows 的 GCC。 C 编译器。
  • 没有测试,所以不知道有没有错误

标签: c file winapi send wininet


【解决方案1】:

除了代码完全没有检查我看到的以下问题的任何错误之外:

  1. 每次调用InternetWriteFile() 都会传递一个未初始化的指针作为最后一个参数。这样做会调用未定义的行为。从那时起,一切都可能发生。

    修复此更改

    LPDWORD bytesWritten;
    

    成为

    DWORD bytesWritten;
    

    并像这样将其地址传递给InternetWriteFile()

    InternetWriteFile(..., &bytesWritten);
    
  2. InternetWriteFile() 被告知通过 strlen(data1)+1 写入 char-array 的 '\0'-terminator。

    为什么?这根本不符合逻辑。 0 不是文件的一部分,而只是用于标记字符串结尾的 C 人工制品。

  3. HTTP 标准要求文本行必须以 结尾。该代码仅使用 (\n)。

    将其更改为\r\n

  4. 这样的铸件并不致命,但没用

    InternetWriteFile(..., (const void*)data1, ...
    

    C(相对于 C++)隐式转换从/到void-指针。所以只需使用

    InternetWriteFile(..., data1, ...
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多