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