move_uploaded_file で「ストリームを開けませんでした: 権限が拒否されました」というエラーが発生する 質問する

move_uploaded_file で「ストリームを開けませんでした: 権限が拒否されました」というエラーが発生する 質問する

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 から次のエラーが発生し続けます:

警告: move_uploaded_file(images/robot.jpg): ストリームを開けませんでした: /var/www/html/mysite/process.php の 78 行目でアクセスが拒否されました

警告: move_uploaded_file(): /var/www/html/mysite/process.php の 78 行目で '/tmp/phpsKD2Qm' を 'images/robot.jpg' に移動できません

ご覧のとおり、アップロード ファイルに関する php.ini ファイルからの構成は取得されませんでした。

ここで何が間違っているのでしょうか?

ベストアンサー1

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

  1. Apacheプロセスの所有者を確認してください:$ps aux | grep httpd最初の列は所有者です。通常はnobody
  2. の所有者imagesを、手順 1 で見つけた所有者に変更しtmp_file_uploadます。nobody

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. chmod を実行imagesし、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-diropen_basedir指令についても言及していることに注意してください。

おすすめ記事