如何使用可被php脚本读取的wininet传输文件?

时间:2020-03-06 15:02:48  来源:igfitidea点击:

我想使用wininet将文本文件传输到Web服务器,就好像该文件是使用将文件发布到服务器的Web表单传输的一样。

根据收到的答案,我尝试了以下代码:

static TCHAR hdrs[] = "Content-Type: multipart/form-data\nContent-Length: 25";
 static TCHAR frmdata[] = "file=filename.txt\ncontent";

   HINTERNET hSession = InternetOpen("MyAgent",
      INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
   HINTERNET hConnect = InternetConnect(hSession, "example.com",
      INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
   HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "test.php", NULL, NULL, NULL, 0, 1);
   HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));");

test.php脚本正在运行,但似乎未获取正确的数据。

有人可以给我任何其他帮助或者寻找地方吗?谢谢。

解决方案

这是其中涉及的事物的一般描述。基本上,我们必须创建一个针对网址的HTTP请求,将信息添加到请求中,然后发送。根据情况,该请求必须是POST请求。

让我们一次迈出这一步。

首先涉及的HTTP标头:

  • 内容类型:多部分/表单数据
  • 内容长度:<这取决于内容字节的总和>

然后,我们必须使用POST表单的内容构建一个字符串。假设我们具有名为file的输入:

file=filename.txt

  <You now add the content of the file after that carriage return>

我们计算此字符串的长度,然后放在上面的Content-Length上。

好的,完整的HTTP请求如下所示:

POST /file_upload.php HTTP/1.0
Content-type: multipart/form-data
Content-length: <calculated string's length: integer>

file=filename.txt
...File Content...

现在从PHP手册中获取一些代码:

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['file']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

知道我,我可能已经弄乱了内容的格式,但这是总的想法。

将上面的表单数据和标题更改为以下内容可以解决此问题:

static TCHAR frmdata[] = "-----------------------------7d82751e2bc0858\nContent-Disposition: form-data; name=\"uploadedfile\"; filename=\"file.txt\"\nContent-Type: text/plain\n\nfile contents  here\n-----------------------------7d82751e2bc0858--";
  static TCHAR hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";