перемещение загруженного файла выдает ошибку "не удалось открыть поток: отказано в разрешении" после всех настроек, которые я сделал
Я продолжаю получать эту ошибку при попытке настроить каталог загрузки с помощью 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_файл(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 в отношении загружаемого файла.
Что я здесь делаю не так?
12 answers
Это связано с тем, что images
и tmp_file_upload
доступны для записи только пользователем root
. Для загрузки на работу нам нужно сделать владельца этих папок таким же, как владелец процесса httpd, ИЛИ сделать их глобально доступными для записи (плохая практика).
- Проверьте владельца процесса apache:
$ps aux | grep httpd
. Первый столбец будет владельцем, как правило, это будетnobody
-
Измените владельца
images
иtmp_file_upload
, чтобы статьnobody
или любым другим владельцем, которого вы нашли на шаге 1.$sudo chown nobody /var/www/html/mysite/images/ $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
-
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/
Для получения более подробной информации о причинах такого поведения ознакомьтесь с руководством http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , обратите внимание, что в нем также говорится о директиве
open_basedir
.
Вы также можете запустить этот скрипт, чтобы узнать владельца процесса Apache:
<?php echo exec('whoami'); ?>
А затем измените владельца целевого каталога на то, что у вас есть. Используйте команду:
chown user destination_dir
, А затем используйте команду
chmod 755 destination_dir
Чтобы изменить разрешение на каталог назначения.
Если у вас установлена Mac OS X, перейдите в корневой каталог файла или папку вашего веб-сайта.
Затем щелкните по нему правой кнопкой мыши, перейдите к получению информации, перейдите в самый низ ( Общий доступ и разрешения ), откройте его, измените все только для чтения на чтение и запись. Обязательно откройте замок, перейдите к значку настройки и выберите Применить к вложенным элементам...
Измените разрешения для этой папки
# chmod -R 0755 /var/www/html/mysite/images/
Я столкнулся с этой связанной проблемой даже после того, как уже успешно запустил composer. Я обновил composer, и при запуске composer install
или php composer.phar install
я получил:
...не удалось открыть поток: в разрешении отказано...
После долгих исследований выяснилось, что предыдущие ответы, касающиеся изменения разрешений для папки, сработали. Теперь это просто немного другие каталоги.
В моей установке на OS X файл кэша находится в /Users/[USER]/.composer/cache
, и у меня возникли проблемы, потому что файл кэша принадлежал root. Изменение права собственности на ".composer" рекурсивно для моего пользователя решило проблему.
Вот что я сделал:
sudo chown -R [USER] cache
Затем я снова запустил установку композитора и вуаля!
Это сработало для меня.
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(/.*)?'
Попробуйте это:
-
Открыть /etc/apache2/envvars
sudo gedit /etc/apache2/envvars
-
Замените
www-data
вашимyour_username
"export APACHE_RUN_USER=www-data"
Заменить на
export APACHE_RUN_USER='your_username'
Я хотел добавить это к предыдущим предложениям. Если вы используете версию Linux, в которой включен SELinux, вам также следует выполнить это в оболочке:
chcon -R --type httpd_sys_rw_content_t /path/to/your/directory
Наряду с предоставлением разрешений пользователю вашего веб-сервера либо через группу, либо через смену владельца каталога.
Эта проблема возникает, когда пользователь apache (www-данные) не имеет разрешения на запись в папку. Для решения этой проблемы вам необходимо поместить пользователя в группу www-данные.
Я только что сделал это:
Выполните этот 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-данные
chown -R user:www-data yourprojectfoldername
chmod 775 yourprojectfoldername
Попробуйте это
find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664
Просто измените разрешение tmp_file_upload на 755 Ниже приведена команда chmod -R 755 tmp_file_upload
Решение так просто. Только щелкните правой кнопкой мыши папку ИЗОБРАЖЕНИЯ (назначения), перейдите в свойства, перейдите на вкладку разрешения и измените доступ других пользователей к Создание и удаление файлов.