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 $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.

Ответ 2

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

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

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

chown user destination_dir

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

chmod 755 destination_dir

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

sudo chown -R [USER] cache

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

Ответ 6

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

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

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

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

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

    "export APACHE_RUN_USER=www-data" 
    

    заменить

    export APACHE_RUN_USER='your_username' 
    

Ответ 8

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

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

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

Ответ 9

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

Я только что сделал это:

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

[email protected]:/# cd /var/www/html

[email protected]:/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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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