サイトを共有ホスティングから VPS に移行中です。VPS でテストしたところ、突然、Web フォームからファイルをアップロードできなくなったことに気付きました。
エラー:
Warning: move_uploaded_file(/uploads/logoklein.jpg): failed to open stream: No such file or directory in /var/www/vhosts/denkproducties.nl/httpdocs/denkproducties/upload.php on line 26 Warning: move_uploaded_file(): Unable to move '/tmp/php01nhmx' to '/uploads/logoklein.jpg' in /var/www/vhosts/denkproducties.nl/httpdocs/denkproducties/upload.php on line 26
SO にはこれに関する質問がたくさんありますが、ほとんどの場合、パーミッションを正しく設定する必要があります。TMP とアップロード ディレクトリの両方を 0777 (身震い) に chmod しましたが、役に立ちませんでした。0777 を実行するのは賢明なことではありませんが、これらのフォルダーのアクセス許可の問題ではないことを確認したかったのです。
変更されたのは VPS だけなので、問題はサーバーにあるに違いないと考えました。Web サーバーが「nobody」として実行されている可能性があると考えたため、tmp フォルダーにアクセスできませんでした。私は走った:
ps aux | grpe httpd
それは私を示しています:
root 27371 0.0 2.3 340860 24726 ? SNs 12:57 0:00 /usr/sbin/httpd
apache 27372 0.0 0.9 240994 9820 ? SN 12:57 0:00 /usr/sbin/httpd
apache 27373 0.0 1.6 341671 16700 ? SN 12:57 0:00 /usr/sbin/httpd
apache 27374 0.0 1.6 341671 16700 ? SN 12:57 0:00 /usr/sbin/httpd
apache 27375 0.0 1.6 341671 16700 ? SN 12:57 0:00 /usr/sbin/httpd
apache 27376 0.0 1.6 341671 16700 ? SN 12:57 0:00 /usr/sbin/httpd
apache 27377 0.0 1.6 341671 16700 ? SN 12:57 0:00 /usr/sbin/httpd
apache 27378 0.0 1.6 341671 16700 ? SN 12:57 0:00 /usr/sbin/httpd
root 27817 0.0 0.0 103244 824 tty1 S+ 13:40 0:00 grep httpd
ちなみに、私のサーバーはfCGIを実行しています。
完全を期すために、Web フォームを使用した小さなアップロード スクリプトを作成しました。
$allowed_filetypes = array('.jpg','.gif','.bmp','.png'); // これらは、検証に合格するファイルの種類になります。 $max_filesize = 1024000; // BYTES 単位の最大ファイルサイズ (現在は 1MB)。 $upload_path = '/アップロード/'; // ファイルがアップロードされる場所 (現在は「アップロード」ディレクトリ)。 $filename = $_FILES['userfile']['name']; // ファイルの名前を取得します (ファイル拡張子を含む)。 $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // ファイル名から拡張子を取得します。 // ファイルタイプが許可されているかどうかを確認し、許可されていない場合は DIE を確認し、ユーザーに通知します。 if(!in_array($ext,$allowed_filetypes)) die('アップロードしようとしたファイルは許可されていません。'); // ここでファイルサイズをチェックし、大きすぎる場合は DIE してユーザーに通知します。 if(filesize($_FILES['userfile']['tmp_name']) > $max_filesize) die('アップロードしようとしたファイルが大きすぎます。'); // 指定されたパスにアップロードできるかどうかを確認し、そうでない場合は DIE にしてユーザーに通知します。 //if(!is_writable($upload_path)) // die('You cannot upload to '. $upload_path .'the specified directory, please chmod it to 777.'); // 指定したパスにファイルをアップロードします。 if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $filename)){ echo 'ファイルのアップロードに成功しました。ここでファイルを表示してください'; // 出来た。 } そうしないと { echo 'ファイルのアップロード中にエラーが発生しました。もう一度やり直してください。// 失敗しました :(. }
ここで何が欠けていますか?