如何使用表单中的内容将文件写入服务器?

How do I write a file to my server with the contents from a form?

好的,我正在设置一个具有 Wi-Fi 和 ePaper 显示屏的设备。

通常情况下,设备通过Wi-Fi连接到互联网,一切都按计划进行。但是,有时我想将我的设备带到具有不同 Wi-Fi 连接的新位置。

我要实现的是:

  1. 设备识别出它已失去连接并快速执行 扫描区域内可用的接入点。
  2. 然后禁用客户端 Wi-Fi 设置,启用 Wi-Fi 热点并显示 QR 显示屏上的智能 phone 连接代码。
  3. 智能 phone 用户然后从上面步骤 1 中扫描的列表中选择 Wi-Fi 接入点(以网页格式显示)。
  4. 然后用户输入该接入点的密码。
  5. 此时设备会尝试连接到该 AP 并且生活继续。

现在,我在将选定的 Wi-Fi 连接和密码保存到网络服务器上时遇到问题(第 4 步)。

我有点意识到我需要使用 PHP 和 CGI​​,但是,我尝试过的所有代码都没有在我的设备(Apache 网络服务器)上创建任何文件。

最近,我试过一直拨回去,只是硬编码我想要它保存的内容和位置,但仍然没有任何乐趣:

<html>
  <head>
  </head>
  <body>
    <h1>some test</h1>
        <form method="post">
           Access Point Password:<br>
          <input type="text" name="passwd" id="passwd" size="40"><br>
          <input type="submit" name="save">
        </form>
  </body>
</html>

<?php
    $passwd = $_POST['passwd'];
    $fp = fopen('/tmp/wifi.pwd', 'a');
    fwrite($fp, $passwd);
    fclose($fp);
?>

我的 PHP 版本是 PHP 7.3.27-1~deb10u1 (cli) (built: Feb 13 2021 16:31:40) ( NTS )

设备是运行Raspbian GNU/Linux 10 (buster)

/tmp/ 上的属性是 drwxrwxrwt,因此任何人都应该能够在那里创建文件。

请注意 - 我不能使用数据库来完成此操作。它需要以明文形式完成。

======更新====== 好的,抱歉延迟,新工作,大量培训,大量工作,很少有时间陪伴家人,甚至

所以我一直在研究(很多)代码。 - 我已经用我目前使用的代码更新了上面的内容

我也试过:

<?php
    print_r($_POST);
    if( !empty($_POST['passwd']) ) {
        $passwd = $_POST['passwd'];
        file_put_contents("/tmp/wifi.pwd", $passwd . "\n", FILE_APPEND);
        exit();
    }
?>

仍然没有创建文件。

Undefined index: passwd in /var/www/html/net/1.php on line 240
这意味着 $_POST 数组存在,但 'passwd' 不在其中。对随后发布的内容进行 print_r($_POST);

检查您的 php.ini 并确保 post_max_size 不为 0。

请注意,第一次加载页面时,$_POST 将为空。所以一旦你肯定会看到这个错误信息。 $_POST 将仅包含您提交表单时的数据。
如果您想第一次避免出现该错误消息,请执行

if( !empty($_POST['passwd']) ) {
  $passwd = $_POST['passwd'];
  ...
  fclose($fp);
}

好吧,我有点失望,甚至有点生气,这是答案,因为它是程序本身的一个限制,不会提供任何错误、警告或通知。

我设法在另一个没有投票的问题的隐藏答案中找到了我的答案。 (不用说它现在得到了赞成票!)

我什至不去 link 那里问的问题,但提供的答案解决了我遇到的问题。

https://askubuntu.com/a/1138314/548774

底线是 Apache2 不会写入文件系统中除 /var/www/ 或子目录之外的任何地方

我在使用 PHP 时遇到的错误是因为我引入了它们来尝试解决为什么它不会将文件写入 /tmp/。