Файл 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 относительно файла загрузки.

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

16 ответов

Решение

Это потому что 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 теперь может быть записано владельцем, если это необходимо [кажется, у вас уже есть это на месте]. Упоминается в ответе Дмитрия Теплякова.

    $ 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, обратите внимание, что оно также говорит о open_basedir директивы.

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

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

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

chown user destination_dir

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

chmod 755 destination_dir

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

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

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(/.*)?'

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

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

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

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

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

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

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

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

  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' 
    

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

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

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

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

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

sudo chown -R [USER] cache

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

Решение очень простое. Только щелкните правой кнопкой мыши папку ИЗОБРАЖЕНИЕ (назначение), перейдите в свойства, перейдите на вкладку разрешений и измените доступ других пользователей к созданию и удалению файлов.

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

Просто измените разрешение tmp_file_upload на 755. Далее следует команда chmod -R 755 tmp_file_upload

Попробуй это

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664

Я пробовал все вышеперечисленные решения, но следующее решило мою проблему

      chcon -R -t httpd_sys_rw_content_t your_file_directory

Мне пришлось изменить владельца файла на «_www», который принадлежит пользователю и группе Apache.

Бывает если SELinuxвключен. Отключить это в /etc/selinux/config установив SELINUX=disabled и перезапустите сервер.

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

Прежде всего, я открываю все разрешения файла, который я загружу, с помощью кода ниже.

Напишите в терминале следующий код.

      sudo chmod -R 777 /Applications/XAMPP/xamppfiles/htdocs

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

Другие вопросы по тегам