私はファイルアップロードページを持っていて、この問題の原因を見つけるために、コードを調べて、行ごとに段階的にデバッグ行を挿入しました。問題は、次のコード ブロックのどこかで発生します。
$tmp_name = $_FILES['image_large']['tmp_name'];
chdir('..'.DIRECTORY_SEPARATOR.'photos');
$name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name'];
$success = move_uploaded_file($tmp_name,$name);
$errormsg = "<p>source: {$tmp_name}</p><p>destination: {$name}</p>";
$errormsg .= "<p>error: {$success}</p>";
これ$errormsg
はページに出力され、次の結果が表示されます。
ソース: C:\xampp\tmp\php4A14.tmp
宛先: C:\xampp\htdocs\photos\fingerlakes1.jpg
エラー: 1
編集:上記は本当に紛らわしいので、明確にしましょう。「エラー: 1」は $_FILES['image_large']['error'] を参照していません。これは、move_uploaded_file が機能したかどうかを参照するブール値であるため、1 を取得することが望ましい結果です。
その宛先は、ファイルの移動先として意図された正しい場所です。しかし、チェックすると、デバッグ結果はコンピューターがタスクを正常に実行したと確信しているように見えますが、「C:\xampp\htdocs\photos\fingerlakes1.jpg」というファイルは作成されていません。
$success
また、フォルダーの書き込み権限が有効になっていることも確認しました(Windows 7を使用しています)が、それが原因である場合はtrueと評価されなかったと思います。
編集:私もprint_r($_FILES)
すべてをチェックするために使用しようとしましたが、返されました:
配列 ( [image_large] => 配列 ( [名前] => fingerlakes1.jpg [タイプ] => image/jpeg [tmp_name] => C:\xampp\tmp\php5694.tmp [エラー] => 0 [サイズ] = > 497376 ) [image_thumb] => Array ( [名前] => fingerlakes1.jpg [タイプ] => image/jpeg [tmp_name] => C:\xampp\tmp\php5695.tmp [エラー] => 0 [サイズ] => 26228 ) )
そのため、ファイルは少なくとも tmp フォルダーに正しくアップロードされているようです。
EDIT 2:役立つ場合の詳細情報:XAMPPコントロールパネルを管理者モードで実行して、XAMPPを使用しています。現在、ローカルでテストしているだけです (つまり、ファイルのアップロードは、コンピューターのある部分から別の部分にファイルをコピーするだけです)。目的のフォルダー「写真」と「サムネイル」に移動し、右クリック->プロパティ->セキュリティを実行し、リストされているすべてのユーザーに書き込みアクセス権があることを確認しました。このコンピューターにはアカウントが 1 つしかありませんが、アカウント名がユーザーと管理者として 2 回記載されており、さらに SYSTEM ともう 1 つ忘れてしまいました。しかし、安全のためにすべての書き込みアクセスを許可しました。
編集 3: リクエストに応じて、この投稿の上部にある最初のコード ボックスのコードをいくつか置き換えて問題をテストし、chdir と getcwd の行を宛先のリテラル パス + ファイル名に置き換えてみました。コードは現在次のようになっています。
$tmp_name = $_FILES['image_large']['tmp_name'];
//chdir('..'.DIRECTORY_SEPARATOR.'photos');
//$name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name'];
$errormsg .= "<p>source: {$tmp_name}</p>";
$errormsg .= "<p>destination: C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg</p>";
$success = move_uploaded_file($tmp_name,"C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg");
宛先文字列を書き出すバックスラッシュには、エスケープ シーケンスを使用する必要がありました。最初はそれをするのを忘れていたので、目的の文字列が台無しになっていることを示すエラーをページに出力しました。その場合はエラーが発生しなかったため、変数 $tmp_name および $name にバックスラッシュが埋め込まれていても問題はなかったと思います。
Windows がディレクトリ セパレーターにバックスラッシュを使用し、インターネットがスラッシュを使用しているという事実に問題があるのではないかと考えています。おそらく XAMPP はスラッシュを予期していますか? 多くの人がローカルで XAMPP を使用してコードをテストしているため、これが問題であるとは思えません。
編集 4: 見つかった問題の考えられる原因: コンピューター上のすべてのフォルダーに「読み取り専用」のチェックボックスがオンになっていることがわかりました。これは、このphpの問題を除いて、コンピューターで何かをするのを止めませんでしたが、とにかくグーグルで調べました. これを見つけました: http://iteexpertvoice.com/home/fixing-the-windows-7-read-only-folder-blues/
したがって、これは Windows のバグのようですが、Windows は通常、とにかく読み取り専用の設定を無視します。ただし、move_uploaded_file の問題がこれに関連している可能性があるのではないかと思います。そのページの解決策のいくつかを試して、また報告します。
編集 5: 実際にはコードに問題はなく、これは Windows の問題であると強く疑い始めています。私が言及しなかったことの 1 つは、もともと XAMPP がインストールされた別のハード ドライブにすべてのサイト ファイルがあり、ファイルのアップロードがそこで機能し、新しいドライブに移動してからコードが変更されていないことです。唯一の違いは、当時、手動で画像を宛先フォルダーにドロップしてから、ファイルのアップロード (基本的にはアップロードして自分自身を上書きすること) を使用して、ファイル アップロード フォームの残りの部分を使用して書き込みできるようにしたことです。 MySQL データベース。それはうまくいきました。現在の問題を発見した理由の 1 つは、データベースに書き込むコードがファイルのアップロードの問題によってブロックされていることです。
ということで、他にもいろいろ試してみようと思います。1 つ目は、以前とまったく同じようにテストすることです... ファイルを必要な場所に置き、アップロード フォームを使用してファイルを上書きし、残りのファイルを処理できるかどうかを確認します。データベースに書き込むphpコード。
2 番目に確認することは、サイトの管理側を実行するために必要なすべての php/html ファイルと共に、データベースを Web ホストにアップロードすることです。ファイル アップロード フォームは、自分のコンピューターではローカルでは機能しませんが、問題なく機能するのではないかと、しつこく感じています。
仕事から帰ったらこれらを試して報告します。