PHP 尽管拥有完全权限仍无法移动上传的文件?
PHP Unable To Move Uploaded Files Despite Having Full Permissions?
我正在编写一个类似博客的网站,具有正确发布和显示帖子等功能。目前,我正在尝试添加一个选项,通过使用 PHP 的 move_uploaded_file
功能将图像上传到我的项目文件夹中的文件夹,从而在帖子中包含图像。
我已经通过 chmod
授予 Apache 用户 _www 读取、写入和执行权限。我还确保它有权在通往上传文件夹本身的父目录中写入、读取和执行。
我什至尝试使用 chown
将项目文件夹的全部所有权转让给所述用户。然而,我收到一条 PHP 警告:
PHP Warning: move_uploaded_file(/Users/MyUser/Desktop/Project/assets/php/../uploads/2.jpg): failed to open stream: Permission denied in /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
用户更改为我的用户的情况下解决此问题?
经过自我排查,我终于找到了错误的原因。将回答我自己的问题,作为对那些可能会像我一样犯同样错误的人的注释和未来参考。
macOS Apache 用户不是 MAMP 使用的 Apache 用户。
MAMP的Apache用户与macOS内置的用户不同,即_www
。如果您是 运行 MAMP,请不要使用 _www
,而是转到 /Applications/MAMP/conf/apache/httpd.conf,这是 MAMP 的 Apache 的用户详细信息所在的位置用户位于。
用户很可能是您用户的用户名,这是不可更改的。您可以更改的唯一设置是该 Apache 用户的组。我建议您使用它来构建您的 localhost
,但请记住在切换到 localhost
.
以外的 Web 主机时更改为新的 Apache 用户详细信息
我希望我的错误可以避免您数小时的困惑和一定程度的挫败感。祝你编码愉快!
我正在编写一个类似博客的网站,具有正确发布和显示帖子等功能。目前,我正在尝试添加一个选项,通过使用 PHP 的 move_uploaded_file
功能将图像上传到我的项目文件夹中的文件夹,从而在帖子中包含图像。
我已经通过 chmod
授予 Apache 用户 _www 读取、写入和执行权限。我还确保它有权在通往上传文件夹本身的父目录中写入、读取和执行。
我什至尝试使用 chown
将项目文件夹的全部所有权转让给所述用户。然而,我收到一条 PHP 警告:
PHP Warning: move_uploaded_file(/Users/MyUser/Desktop/Project/assets/php/../uploads/2.jpg): failed to open stream: Permission denied in /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
用户更改为我的用户的情况下解决此问题?
经过自我排查,我终于找到了错误的原因。将回答我自己的问题,作为对那些可能会像我一样犯同样错误的人的注释和未来参考。
macOS Apache 用户不是 MAMP 使用的 Apache 用户。
MAMP的Apache用户与macOS内置的用户不同,即_www
。如果您是 运行 MAMP,请不要使用 _www
,而是转到 /Applications/MAMP/conf/apache/httpd.conf,这是 MAMP 的 Apache 的用户详细信息所在的位置用户位于。
用户很可能是您用户的用户名,这是不可更改的。您可以更改的唯一设置是该 Apache 用户的组。我建议您使用它来构建您的 localhost
,但请记住在切换到 localhost
.
我希望我的错误可以避免您数小时的困惑和一定程度的挫败感。祝你编码愉快!