Файл move_uploaded_file выдает ошибку «Не удалось открыть поток: отказано в доступе» после всех настроек, которые я сделал - PullRequest
131 голосов
/ 12 ноября 2011

Я получаю эту ошибку, когда пытаюсь настроить каталог загрузки с 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 'to' images / robot.jpg 'в /var/www/html/mysite/process.php в строке 78

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

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

Ответы [ 12 ]

172 голосов
/ 12 ноября 2011

Это потому, что 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/
    
  3. Chmod images и tmp_file_upload теперь могут быть доступны для записи владельцу, если необходимо [кажется, у вас уже есть это на месте].Упоминается в ответе @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. Для получения более подробной информации о том, почему это происходит, ознакомьтесь с руководством http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir, обратите внимание, что в нем также говорится о директиве open_basedir.

68 голосов
/ 18 ноября 2013

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

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

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

chown user destination_dir

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

chmod 755 destination_dir

, чтобы изменить разрешение каталога назначения.

16 голосов
/ 15 марта 2016

Если у вас Mac OS X, перейдите в корень файла или в папку вашего сайта.

Затем щелкните правой кнопкой мыши по нему, перейдите, чтобы получить информацию, перейдите в самый низ ( Общий доступ и разрешения ), откройте его, измените все только для чтения на чтение и запись. Обязательно откройте замок, перейдите к значку настройки и выберите Применить к вложенным элементам ...

10 голосов
/ 14 мая 2017

Я хотел добавить это к предыдущим предложениям. Если вы используете версию Linux с включенной SELinux , то вам также следует выполнить это в оболочке:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

Наряду с предоставлением прав доступа вашему веб-серверу либо через группу, либо путем смены владельца каталога.

10 голосов
/ 12 ноября 2011

Изменить разрешения для этой папки

# chmod -R 0755 /var/www/html/mysite/images/

8 голосов
/ 27 апреля 2017

Это сработало для меня.

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

Затем выйдите из системы или перезагрузитесь.

Если SELinux жалуется, попробуйте следующее

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
7 голосов
/ 14 января 2014

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

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

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

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

Вот что я сделал:

sudo chown -R [USER] cache

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

6 голосов
/ 14 июля 2015

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

  1. открыть / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
    
  2. заменить www-data на your_username

    "export APACHE_RUN_USER=www-data" 
    

    заменить на

    export APACHE_RUN_USER='your_username' 
    
5 голосов
/ 15 февраля 2016

Эта проблема возникает, когда пользователь 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
2 голосов
/ 17 августа 2017

Решение очень простое. Только щелкните правой кнопкой мыши папку IMAGE (место назначения), перейдите в свойства, перейдите на вкладку разрешений и измените доступ других пользователей к Создание и удаление файлов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...