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

高洛峰
リリース: 2016-10-09 11:25:15
オリジナル
1496 人が閲覧しました

問題の説明:
本日、ユーザー登録時にアバター画像ファイルをアップロードする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を実行する権限がありません。スクリプトのコードを書いて画像フォルダーを作成したユーザーは同じユーザーではありません

実際には、このような面倒なことをする必要はありません。関数を削除し、エラー処理関数 handle_error() 関数を削除すると、Web ページでエラー メッセージを確認できます。

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

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

画像が永続的に保存されるフォルダーを所有するユーザーを変更し、PHP スクリプトを実行するために Apache を実行するユーザーに変更します。

フォルダーの権限を 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


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!