問題の説明:
本日、ユーザー登録時にアバター画像ファイルをアップロードするPHPスクリプトを実装する際に問題が発生しました:PHPスクリプトは事前に決定されています
ブラウザ側でファイルをアップロードする際にエラーは発生しません。
アップロードされたファイルは合法です。
アップロードされるファイルは画像ファイルです。
サーバー側で一意のファイル名が生成されています。
コード
次に行うべきことは、ファイルを一時的な場所から固定の場所に移動することなので、次のスクリプトを書きました:
//ファイルを一時的な場所から固定の場所に移動します @move_uploaded_file($_FILES[$image_fieldname]['tmp_name'], $upload_filename) または handle_error("画像ファイルの保存中にエラーが発生しました", "ファイルの移動中にエラーが発生しました" . "{$upload_filename }");
コードの handle_error() 関数は、move_uploaded_file 関数がエラーを実行すると、エラーページにジャンプします。明らかに何か問題が発生しました。まず、関数のパラメータにエラーがあるかどうかを確認しました。
PHPマニュアルによると、関数に渡した上記の2つのパラメータはnoであることが保証されています問題がありますが、何が起こっているのでしょうか? ページではエラーが報告されていません (関数の前に PHP の「@」演算子を使用しているため、ページではエラーが報告されません)
注: コードで PHP の @ 演算子を使用する場合は注意してください。
@ 演算子を使用すると、無効なユーザー入力や不正な列を含む SQL クエリ、さらには標準以外の URL エラーに起因する可能性のあるすべての問題を回避できます。つまり、人気のある Web サイトでは、クラッシュしたり停止したりすることができないため、@ 演算子はコードからエラー メッセージをマスクすることができます。この状況における他のエラー解決ソリューション。
PHP開発環境を構築する際にxamppを使用していたため、その時は@演算子がエラーメッセージをブロックしていることに気づきませんでした。開発キットなので、error_log ファイルはインターネット上のほとんどの記事に記載されているものとは異なります。最終的には、
(私のホストは ubuntu) で見つかりました。
php_error_log ファイルはパス
/opt/lampp/logs
実際には、そのような面倒なことをする必要はありません。関数の前の @ 演算子を削除し、エラー処理関数 handle_error() 関数を削除するだけで、エラー メッセージが表示されます。ウェブページ。
何はともあれ、問題の原因が見つかりました。これは非常に喜ばしいことです。フォルダーのユーザーとアクセス許可が間違っているため、次の問題を変更するだけで済みます。
写真が永続的に保存されるフォルダーを所有するユーザーを変更し、Apache を実行し、PHP スクリプトを実行するユーザーに変更します。
フォルダーの権限を 755 に変更します
echo exec('whoami'); //ファイルを実行するユーザー名を取得し、それによって画像フォルダーの権限を変更します
このようにして、スクリプトを実行したユーザーを取得しました: デーモン。私とは違うこと。
フォルダーを所有するユーザーを変更しましょう:
chown daemon -R ~/web/hello_php/uploads
~/web/hello_php/uploads は、画像を保存するターゲット パスです。 -R は、このディレクトリ内のフォルダーのユーザーを再帰的に変更することを意味します。
chmod 775 -R ~/web/hello_php/uploads
参考文献: http://www.manongjc.com/article/1494.html