#php #apache #file-upload #permissions #mamp
#php #apache #загрузка файла #разрешения #mamp
Вопрос:
Я создаю веб-сайт, похожий на блог, с такими функциями, как правильная публикация и отображение сообщений. В настоящее время я пытаюсь добавить опцию для включения изображения в сообщения, загрузив его в папку в папке моего проекта, используя move_uploaded_file
функцию PHP.
Я предоставил пользователю Apache разрешения _www на чтение, запись и выполнение через chmod
. Я также убедился, что у него есть разрешения на запись, чтение и выполнение в родительских каталогах, ведущих к самой папке uploads.
Я даже пытался передать полное владение папкой проекта указанному пользователю с помощью 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
пользователя на моего пользователя?
Комментарии:
1. В большинстве систем обычно вызывается пользователь Apache
www-data
, а не_www
. Не знаю, применимо ли это к Mac.2. @MagnusEriksson Да, я проверил файл конфигурации Apache, и он сказал
_www
.3. Какой файл конфигурации Apache вы проверили? Может быть, посмотрите на вывод из
ps aux
для подтверждения? Я никогда не использовал его, но, насколько я понимаю, MAMP запускается от имени текущего пользователя. По какой-либо причине вы не используете встроенную версию системы (которая выполняется как_www
)?4. @miken32 Хорошо, я несколько часов устранял неполадки и обнаружил, что допустил основную ошибку. Я проверил файл конфигурации для Apache на моем macOS, но не использует Apache MAMP. Итак, все разрешения, которые я установил, были для пользователя, которого я даже не использовал…
Ответ №1:
После некоторого устранения неполадок я сам, наконец, выяснил причину ошибки. Собираюсь ответить на свой собственный вопрос в качестве примечания и ссылки на будущее для тех, кто может в конечном итоге совершить ту же ошибку, что и я.
Пользователь macOS Apache — ЭТО НЕ тот пользователь Apache, которого использует MAMP.
Пользователь Apache в MAMP отличается от пользователя, который встроен в macOS, а именно _www
. НЕ используйте _www
, если вы используете MAMP, а скорее перейдите в /Applications/MAMP/conf/apache/httpd.conf, там находятся данные пользователя для пользователя Apache от MAMP.
Пользователь, скорее всего, будет вашим именем пользователя, которое не изменяется. Единственная настройка, которую вы можете изменить, — это группа этого пользователя Apache. Я предлагаю вам использовать это для создания вашего localhost
, но не забудьте изменить новые данные пользователя Apache при переключении на веб-хост, отличный от localhost
.
Я надеюсь, что моя ошибка может избавить вас от часов путаницы и некоторой степени разочарования. Приятного кодирования!