Web

Почему move_uploaded_file выдает ошибку «Не удалось открыть поток: в доступе отказано»

Я продолжаю получать эту ошибку при попытке настроить каталог загрузки с Apache 2.2 и PHP 5.3 на CentOS.

В php.ini:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

В httpd.conf:

Directory /var/www/html/mysite/tmp_file_upload/>

    Options  -Indexes

    AllowOverride None

    Order allow,deny

    Allow from all

</Directory>

<Directory /var/www/html/mysite/images/>

                Options -Indexes

</Directory>

 

Разрешения каталога CentOS:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images

drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

Независимо от того, что я делаю, при загрузке файла я продолжаю получать эту ошибку от PHP:

Предупреждение: move_uploaded_file (images / robot.jpg): не удалось открыть поток: в /var/www/html/mysite/process.php в строке 78 отказано в доступе

Предупреждение: move_uploaded_file (): невозможно переместить '/ tmp / phpsKD2Qm' в 'images / robot.jpg' в /var/www/html/mysite/process.php в строке 78

Как видите, скрипт никогда не использует конфигурацию из файла php.ini в отношении файла загрузки.

Что я здесь делаю не так?

 

Ответ 1

Это происходит потому, что images и tmp_file_upload доступны для записи только root пользователю. Чтобы загрузка работала, нам нужно сделать владельца этих папок таким же, как и владельца процесса httpd, ИЛИ сделать их глобально доступными для записи (плохая практика).

  1. Проверьте владельца процесса apache: $ps aux | grep httpd. Первый столбец будет владельцем, обычно это будет nobody.

  2. Измените владельца images и tmp_file_upload.  Станьте nobody владельцем или владельцем, который указан на шаге 1.

$sudo chown nobody /var/www/html/mysite/images/

$sudo chown nobody /var/www/html/mysite/tmp_file_upload/

  1. Chmod images и tmp_file_upload теперь может быть доступен владельцам для записи.

$ sudo chmod -R 0755 /var/www/html/mysite/images/

$ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/

  1. Для получения дополнительных сведений о том, почему такое поведение произошло, обратитесь к руководству http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir, обратите внимание, что в нем также говорится о директиве open_basedir.

 

Ответ 2

Вы также можете запустить этот скрипт, чтобы узнать владельца процесса Apache:

<?php echo exec('whoami'); ?>

А затем измените владельца целевого каталога на того, что у вас есть. Используйте команду:

chown user destination_dir

А затем используйте команду:

chmod 755 destination_dir

для изменения разрешения каталога назначения.

 

Ответ 3

Я столкнулся с похожей проблемой даже после того, как уже успешно запустил composer. Я обновил composer, а при запуске composer install или php composer.phar install получил:

... не удалось открыть поток: в доступе отказано ...

После долгих исследований выяснилось, что предыдущие ответы об изменении разрешений для папки не сработали.  Сейчас это просто немного другие каталоги.

В моей установке на OS X файл кеша находится внутри /Users/[USER]/.composer/cach, и у меня были проблемы, потому что файл кеша принадлежал пользователю root. Рекурсивная смена владельца '.composer' для моего пользователя решила проблему. Вот, что я сделал:

sudo chown -R [USER] cache

Затем я снова запустил установку composer и все заработало!

 

Ответ 4

Эта проблема возникает, когда пользователь apache (www-data) не имеет разрешения на запись в папку. Чтобы решить эту проблему, вам нужно поместить пользователя в группу www-data. Я делаю это так.

Выполните этот php-код, <?php echo exec('whoami'); ?>, чтобы обнаружить пользователя, которого использует apache. После этого выполните команды в терминале:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

Этот код вернет что-то вроде этого:

total of files

drwxr-xr-x 7 user group size date folder

Я сохранил пользователя, но изменил группу на www-data:

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

 

Ответ 5

Попробуйте это:

  1. откройте /etc/apache2/envvars

sudo gedit /etc/apache2/envvars.

  1. замените www-data своим your_username

"export APACHE_RUN_USER=www-data" 

замените

export APACHE_RUN_USER='your_username'. 

 

Схожие статьи

Среда разработки HTML: лучшие бесплатные программы для веб-дизайна
Web

Среда разработки HTML: лучшие бесплатные программы для веб-дизайна

Web

PHP - сбросить свойства объектов в массиве после вызова array_filter

Web

Когда использовать self вместо $this?

Web

Есть ли функция для извлечения «столбца» из массива в PHP?