主な目的は、php.ini で Upload_dir_tmp の値が設定されていない場合に、アップロードされたファイルが一時的に保存される場所をテストすることです。このテストの後、php.ini の Upload_dir_tmp の値が設定されていない場合、デフォルトのストレージが使用されることがわかりました。場所は C:windowstemp ディレクトリで、一時ファイルは .tmp 拡張子付きで保存されます。このファイルはすぐに削除されるため、オペレーティング システムのファイル変更検索機能を使用したい場合は、そのファイルが見つからず、見つかりません。 Upload_dir_tmp のデフォルトのパスは次のとおりです。
IIS+phpチュートリアルサーバーが画像をアップロードできない問題の解決策
サーバーはApache2+PHPを使用しており、IIS+PHPに置き換えるとphp.iniの環境変数が読み込めなくなる等の問題が発生します。 phpの認証コードが表示されず、写真をアップロードできないという問題が一部の人から報告されています。
IIS から Apache2 を置き換えるプロセスは、IIS を開いて Apache2 を閉じるだけです。他に変更点はありませんが、PHP をサポートするために IIS にはまだ多くの変更が加えられているようです。
分析:
上記の説明に基づいて、IUSR_MACHINE アカウントにはアップロードの書き込み権限がないため、IIS の権限と以下の権限を変更しました。 NTFS は変更されましたが、結局役に立たず、インターネットで情報を検索しても該当する情報がありませんでした。プロセスは次のとおりです。
swf ファイルはファイルをアップロードするために save.php を呼び出します。 --->swf ファイルはアップロードされたファイルを再アップロードします。名前付け--->save.php に返される名前--->最終的な名前が表示されます。
現在の問題は、swf によるファイルの名前変更でスタックしており、姓が表示されず、swf ファイルがアップロードプロセスに参加していないため、問題は save.php ファイルでのみ見つかります。このファイルはテストされ、最後に表示される名前で使用される変数は fileName であるため、テストのために次のステートメントが挿入されます:
echo "fileName=2008*****.gif";
の関数この文は、fileName に値があり、save.php が正常に表示されることを意味します。最初に元のステートメントを 1 つずつテストし、すべて正常に返されましたが、テストが到達したとき:
if (!@move_uploaded_file($f) ["tmp_name"], $dest_dir .'/'.$fileName)) header("HTTP/1.0 404 Not Found");
この文を言ったときに問題が発生し、コンテキストを検索した後、アップロードできませんでした。 , tmp_nameの変数が見つかりませんでしたが、意味は、ファイルを一時ファイルにアップロードしてから、宛先の場所に移動するということです。ファイルをアップロードできないのは、この場所が書き込み可能ではないためですか?
オンライン情報を検索すると、php.ini の下にアップロード設定が 2 か所あることがわかりました:
file_uploads = On ‐ - アップロード予定 ファイルが保存される一時的な場所
IIS 7 と PHP 5 でファイルのアップロードを設定しようとしています。
「upload_tmp」は機能しません。
最終分析の答え:
上記の内容は 2009 年に書かれたものですが、2010 年 7 月に新しいサーバーを追加し、同時に上記の解決策を再度実行したところ、おそらく問題が発生しました。動作しないため、時間をかけて具体的な原因を調査したところ、次のような問題の理由が見つかりました。
ファイルをアップロードできないことは、すべてのファイルをアップロードできないことを意味するわけではありません。私の Web サイトの 1 つでは、Flash が fwrite() を呼び出してアバターなどを正常に転送しますが、 @move_uploaded_file($f["tmp_name"], $ を呼び出します)このような関数を使用して写真を転送する場合、dest_dir.'/ '.$fileName) をアップロードすることはできません。
分析した結果、その理由は、fwrite() はバイナリ ファイルを転送するのに対し、move_uploaded_file() はテキスト ファイルを転送するためであり、Windows オペレーティング システムはこれら 2 種類のファイルを区別するためです [本書の fwrite() 関数の説明を参照してください。これは、これら 2 つの異なるファイルが PHP 環境にアップロードされるときに保存される一時ディレクトリが異なることを意味します。IIS 環境で PHP を構成する場合、一時ディレクトリは E:tmp に設定されます。ユーザーは書き込み可能で、バイナリファイルのアップロードもできるので、このディレクトリはバイナリファイルアップロード用の一時ファイルの保存場所ではないかと思います。では、move_uploaded_file()で渡されるテキストファイルの一時ファイルの保存場所はどこですか?実際、上記の英語の段落では、upload_tmp_dir で設定されたパスがパスですが、各サーバーのこの設定の値がコメントアウトされているのはなぜですか? , しかし、サーバーによってはアップロードできない場合がありますか?これは、以前に尋ねた質問に戻ります。なぜ Apache2 はアップロードできるのに、iis はアップロードできないのでしょうか?
今回はupload.phpファイルを再度解析し、失敗の原因となったコードを解析しました。 具体的な内容は以下の通りです:
// ファイルがアップロードされているかどうかを確認します
if (! $_FILES['upload'.$ num]['name'] == ""){
If ($_FILES['upload'.$num]['size'] < $max_size) {
1. echo "ファイルのアップロード パス: ".$location .$_FILES['upload' .$num]['name'];
2. echo "ファイル一時ファイル名:".$_FILES['upload'.$num]['tmp_name'];
3. move_uploaded_file( $_FILES['upload'. $num]['tmp_name'],$location.$_FILES['upload'.$num]['name']) または $event = "失敗";
} else {
$event = "ファイルが大きすぎます!" ;
}
通常のコードの 2 番目の文は、テストの便宜のために追加しました。その主な目的は、php に upload_dir_tmp の値が設定されていないことをテストすることです。 .ini にアップロードされたファイルは一時的に保存されます。このテストの後、php.ini の Upload_dir_tmp 値が設定されていない場合、デフォルトの保存場所は C:windowstemp ディレクトリにあり、一時ファイルが保存されることがわかりました。 .tmp 接尾辞が付いていると、ファイルはすぐに削除されるため、オペレーティング システムのファイル変更検索機能を使用したい場合は、ファイルが見つからず、upload_dir_tmp のデフォルト パスも見つかりません。
Upload_dir_tmp のデフォルトのパスが見つかったので、c:windowstemp のアクセス許可を変更し、IUSR_ ユーザーが書き込みできるようにし、IIS Admin サービスを再起動し、ファイルをアップロードして、最終的に成功します。私の複数のサーバーのupload_dir_tmp値がすべて空の場合、転送できるものと転送できないものがあるのはこのためです。