PHP не может переместить загруженные файлы, несмотря на наличие полных разрешений?

#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 .

Я надеюсь, что моя ошибка может избавить вас от часов путаницы и некоторой степени разочарования. Приятного кодирования!