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

时间:2008-10-02 20:00:43

标签: php c++ windows wininet

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

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

 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脚本,但它似乎没有获取正确的数据。

有人可以给我任何额外的帮助或某个地方吗?感谢。

3 个答案:

答案 0 :(得分:2)

让我们一步一步。

首先是HTTP标题参与:

  1. 内容类型:multipart / form-data
  2. Content-Length:<这取决于内容的字节总和>
  3. 然后,您必须使用POST表单的内容构建一个字符串。让我们假设你有一个名为file的输入:

      

    文件= FILENAME.TXT
      <您现在在回车后添加文件的内容>

    您计算此字符串的长度并将其放在上面的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>";
    
    ?>
    

    了解我,我可能搞砸了内容的格式,但这是一般的想法。

答案 1 :(得分:1)

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

  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";

答案 2 :(得分:0)

Here是对其中涉及的事情的一般描述。基本上,您必须创建对Web地址的HTTP请求,将信息附加到请求然后发送。在您的情况下,请求必须是POST请求。