1. ホーム
  2. php

[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る

2022-01-21 10:52:24

質問

CentOSのApache 2.2とPHP 5.3でアップロードディレクトリを設定しようとすると、このエラーが何度も発生します。

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からこのエラーが出続けているのです。

Warning: move_uploaded_file(images/robot.jpg): ストリームを開くのに失敗しました。/var/www/html/mysite/process.php のライン78でパーミッションが拒否されました。

警告:move_uploaded_file(): Unable to move '/tmp/phpsKD2Qm' to 'images/robot.jpg' in /var/www/html/mysite/process.php on line 78

ご覧の通り、アップロードファイルに関するphp.iniファイルからの設定は取得できていません。

私はここで何を間違えているのでしょうか?

どうすればいいですか?

これは imagestmp_file_upload によってのみ書き込みが可能です。 root のユーザーです。アップロードを成功させるためには、これらのフォルダの所有者を httpd プロセスの所有者と同じにするか、グローバルに書き込み可能にする必要があります (バッドプラクティス)。

  1. apacheのプロセスオーナーを確認します。 $ps aux | grep httpd . 最初のカラムはオーナーで、典型的には次のようになります。 nobody
  2. のオーナーを変更します。 imagestmp_file_upload になるように nobody またはステップ1で見つけた所有者。

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
    
  3. chmod imagestmp_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 ディレクティブを使用します。