ホームページ  >  記事  >  php教程  >  PHP の move_uploaded_file 関数が画像の移動に失敗する問題を解決する

PHP の move_uploaded_file 関数が画像の移動に失敗する問題を解決する

WBOY
WBOYオリジナル
2016-09-30 09:23:091469ブラウズ

問題の説明:
本日、ユーザー登録時にアバター画像ファイルをアップロードするPHPスクリプトを実装する際に問題が発生しました:PHPスクリプトは事前に決定されています

ブラウザ側でファイルをアップロードする際にエラーは発生しません。
アップロードされたファイルは合法です。
アップロードされるファイルは画像ファイルです。
サーバー側で一意のファイル名が生成されています。
コード
次に行うべきことは、ファイルを一時的な場所から固定の場所に移動することなので、次のスクリプトを書きました:

//ファイルを一時的な場所から固定の場所に移動します @move_uploaded_file($_FILES[$image_fieldname]['tmp_name'], $upload_filename) または handle_error("画像ファイルの保存中にエラーが発生しました", "ファイルの移動中にエラーが発生しました" . "{$upload_filename }");
コードの handle_error() 関数は、move_uploaded_file 関数がエラーを実行すると、エラーページにジャンプします。明らかに何か問題が発生しました。まず、関数のパラメータにエラーがあるかどうかを確認しました。

$_FILES[$image_fieldname]['tmp_name']$upload_filename //これは私が自分で結合したファイルパスであり、正しいことが保証されています

PHPマニュアルによると、関数に渡した上記の2つのパラメータはnoであることが保証されています問題がありますが、何が起こっているのでしょうか? ページではエラーが報告されていません (関数の前に PHP の「@」演算子を使用しているため、ページではエラーが報告されません)

@オペレーター

注: コードで PHP の @ 演算子を使用する場合は注意してください。

@ 演算子を使用すると、無効なユーザー入力や不正な列を含む SQL クエリ、さらには標準以外の URL エラーに起因する可能性のあるすべての問題を回避できます。つまり、人気のある Web サイトでは、クラッシュしたり停止したりすることができないため、@ 演算子はコードからエラー メッセージをマスクすることができます。この状況における他のエラー解決ソリューション。

エラーログファイルを探しています

PHP開発環境を構築する際にxamppを使用していたため、その時は@演算子がエラーメッセージをブロックしていることに気づきませんでした。開発キットなので、error_log ファイルはインターネット上のほとんどの記事に記載されているものとは異なります。最終的には、
(私のホストは ubuntu) で見つかりました。 php_error_log ファイルはパス
/opt/lampp/logs

で見つかりました。もちろん、Apache の error_log ファイルもこのパスに保存されています。 php_error_log ファイルには、権限が不足しているというエラーが見つかりました。エラーが発生した場所: 保存した画像の宛先ディレクトリには、PHP を実行するユーザーの権限がありません。PHP スクリプトを実行するユーザーは、スクリプト コードを記述して画像フォルダーを作成したユーザーと同じではありません。

実際には、そのような面倒なことをする必要はありません。関数の前の @ 演算子を削除し、エラー処理関数 handle_error() 関数を削除するだけで、エラー メッセージが表示されます。ウェブページ。

ターゲット フォルダーのアクセス許可を変更します

何はともあれ、問題の原因が見つかりました。これは非常に喜ばしいことです。フォルダーのユーザーとアクセス許可が間違っているため、次の問題を変更するだけで済みます。

写真が永続的に保存されるフォルダーを所有するユーザーを変更し、Apache を実行し、PHP スクリプトを実行するユーザーに変更します。
フォルダーの権限を 755 に変更します

それでは、Apache を実行しているユーザーは誰でしょうか?PHP スクリプトを使用して以下を取得します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。