【问题标题】:PHP Unable To Move Uploaded Files Despite Having Full Permissions?尽管拥有完整权限,PHP 仍无法移动上传的文件?
【发布时间】:2019-09-13 23:47:05
【问题描述】:

我正在编写一个类似博客的网站,该网站具有正确发布和显示帖子等功能。目前,我正在尝试添加一个选项,通过使用 PHP 的 move_uploaded_file 函数将图像上传到我的项目文件夹中的文件夹来在帖子中包含图像。

我已通过chmod 授予 Apache 用户 _www 读取、写入和执行权限。我还确保它有权在指向上传文件夹本身的父目录中写入、读取和执行。

我什至尝试使用chown 将项目文件夹的全部所有权转让给上述用户。然而,我收到一个 PHP 警告,上面写着:

PHP 警告:move_uploaded_file(/Users/MyUser/Desktop/Project/assets/php/../uploads/2.jpg):无法打开流:/Users/MyUser/Desktop/Project/assets/ 中的权限被拒绝php/upload.php

PHP

$target_dir = __DIR__ . "/../uploads/";
var_dump($target_dir);
$file = basename($_FILES["file"]["name"]);
$target_file = $target_dir . $file;
$allowed_extensions = array("jpeg", "jpg", "png");
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));


if(isset($_POST["upload"])) {
  echo $target_file;

  $stmt = $pdo->prepare("INSERT INTO images (imgTitle, imgLocation) VALUES (:imgTitle, :imgLocation)");
  $stmt->execute(array(
    ":imgTitle" => basename($_FILES["file"]["name"]),
    ":imgLocation" => $target_file
  ));

  if ($imageFileType = in_array($imageFileType, $allowed_extensions)) {
    move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);
  }
}

HTML

<form action="" method="post" enctype="multipart/form-data">
    Select Image File to Upload:
    <p><input type="file" name="file"></p>
    <input type="submit" name="upload" value="Upload">
</form>

为什么会发生这种情况?如何在不将 _www 用户更改为我的用户的情况下解决此问题?

【问题讨论】:

  • 在大多数系统上,Apache 用户通常称为www-data,而不是_www。不过,不知道这是否适用于 Mac。
  • @MagnusEriksson 是的,我检查了 Apache 配置文件,上面写着 _www
  • 您检查了哪个 Apache 配置文件?也许看看ps aux 的输出来确认?我从未使用过它,但我的理解是 MAMP 以当前用户身份运行。您不使用系统内置版本(以_www 运行)的任何原因?
  • @miken32 好的,所以我做了几个小时的故障排除,发现我犯了一个基本错误。我在我的 macOS 上检查了 Apache 的配置文件,但没有检查 Apache MAMP 使用的配置文件。所以我设置的所有权限都是针对我什至没有使用的用户...

标签: php apache file-upload permissions mamp


【解决方案1】:

经过我自己的一些故障排除后,我终于找到了错误的原因。将回答我自己的问题作为注释和未来的参考,以供那些可能会像我一样犯下同样错误的人。

ma​​cOS Apache 用户不是 MAMP 使用的 Apache 用户。

MAMP 的 Apache 用户不同于 macOS 内置的用户 _www。如果您正在运行 MAMP,请不要使用 _www,而是转到 /Applications/MAMP/conf/apache/httpd.conf,这是 MAMP 的 Apache 用户的用户详细信息所在的位置.

用户很可能是您用户的用户名,该用户名是不可更改的。您可以更改的唯一设置是该 Apache 用户的组。我建议您使用它来构建您的 localhost,但是当您切换到 localhost 以外的 Web 主机时,请记住更改为新的 Apache 用户详细信息。

我希望我的错误可以为您节省数小时的困惑和一定程度的挫败感。玩得开心编码!

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2022-08-17
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多