Файл move_uploaded_file выдает ошибку «не удалось открыть поток: отказано в доступе» после всех конфигураций, которые я сделал

120

Я продолжаю получать эту ошибку при попытке настроить каталог загрузки с 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 относительно файла загрузки.

Что я здесь делаю неправильно?

  • 0
    775? Возможно, ваш сервер работает как никто. Только root может писать в этом случае (ваши права "изображения") ...
  • 0
    что это значит ? как я могу это изменить?
Показать ещё 1 комментарий
Теги:
upload

12 ответов

168
Лучший ответ

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

  1. Проверьте владельца процесса apache: $ps aux | grep httpd $ps aux | grep httpd. Первый столбец будет владельцем, как правило, nobody будет
  2. Измените владельца images и tmp_file_upload чтобы стать nobody или nobody либо владельцем, которого вы нашли на шаге 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. images tmp_file_upload и 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.

  • 4
    Спасибо: наш старый владелец был демоном, теперь он Apache
  • 0
    Это исправление применяется к ситуациям, когда вы можете изменить тип php сервера с fast_CGI, CGI на Apache_mod, например plesk и т. Д., Можете продолжать с разрешениями исходного пользователя, а не apache. Это исправило мои проблемы.
Показать ещё 3 комментария
60

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

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

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

chown user destination_dir

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

chmod 755 destination_dir

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

  • 2
    Спасибо, это работает для меня. Сначала я использовал метод Laith Shadeed, но я не получаю тот же результат при наборе ps aux | grep httpd и <?php echo exec('whoami'); ?> Кто-нибудь знает почему?
  • 1
    PS Aux | grep https не возвращает имя владельца веб-сервера. Это делает: PS Aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | голова -1 | cut -d \ -f1 Фрон Symfony док.
Показать ещё 6 комментариев
14

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

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

  • 0
    Почему вы комментируете Mac OS, когда его вопрос касается системы Linux?
  • 2
    Извините, я этого не видел !!!
Показать ещё 6 комментариев
10

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

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

  • 1
    сделал это сейчас так: drwxrwxr-x 2 root root 4096 11 ноября 10:01 изображения также на: drwxrwxr-x 2 root root 4096 12 ноября 04:54 tmp_file_upload но все та же ошибка
7

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

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(/.*)?'
  • 0
    спас мою жизнь :) .. я использую GIT post-recive hook для развертывания моей сети, и каждый раз, когда я развертываю, я получаю его ошибку «Отказано в разрешении», добавление пользователя git в www-data исправляет это :) спасибо
  • 0
    Это лучший ответ.
7

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

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

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

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

Это то, что я сделал:

sudo chown -R [USER] cache

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

5

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

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

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

  • 0
    restorecon -R -v /path/to/your/directory вероятно, также необходимо включить в это впоследствии. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/...
  • 0
    вполне может быть правдой, но я предполагал, что chcon «изменил контекст», то есть он был просто изменен. то, что вы смотрите, сначала использует «semanage fcontext», который помещает его в файл некоторых настроек «file_contexts.local», однако он никогда не меняет контекст.
Показать ещё 1 комментарий
5

Попробуйте следующее:

  • открыть/etc/apache2/envvars

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

    "export APACHE_RUN_USER=www-data" 
    

    заменить

    export APACHE_RUN_USER='your_username' 
    
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​​p >

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
2

Просто измените разрешение tmp_file_upload на 755 Ниже приведена команда chmod -R 755 tmp_file_upload

2

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

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

  • 0
    получение: chmod: пропущенный операнд после `664 '
1

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

  • 0
    как один щелчок правой кнопкой мыши с клавиатуры?
  • 0
    Самый быстрый способ, НО, только вы используете GUI для FTP (FileZilla, WinSCP)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню