- ベストアンサー
ファイルのアップロードができない理由と解決方法
- 送信フォームを使って画像をアップロードさせたいのですが、うまくいきません。ブラウザ上でエラー表示は出ないのですが、移動させたいディレクトリにファイルが入ってこない状況です。
- 初心者なので、参考書を片手に例文をカスタマイズしていったので、アルゴリズム自体がどこか間違っているかもしれません。
- 結局、テンポラリディレクトリからの移動先ディレクトリを自分で定義してmove_uploaded_file()しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 はずれでしたか(笑。 ちょっと気がついたところを。 最初に if (isset($_POST["submit"])) { とありますが、アップロードフォームにsubmitという名前のついた送信ボタンはありませんが、そのボタンはあるのでしょうか? フォームタグも閉じられて(</form>)いません。 あと、基礎的な事ですが、フォームでMAX_FILE_SIZEを指定しています。最近の画像ファイルはとても大きいので、結構これで引っかかる可能性があるんですよね。 このスクリプトではどこで問題が起こっているか分かりにくいですね。何も表示されないというのは困ります。 問題を切り分ける為に、たくさんのデバッグ用のエラーや状況を吐き出すようにしておいた方が良いです。スクリプト部分をエラー表示用に書き換えてみます。コメントはうざいので削除しました。私の環境では問題なく動いています。 /////////////////////////////////////////////////// <?php $debug = true;//デバッグ用フラグ、trueならばデバッグ中、falseならデバッグ終わり if (isset($_POST["submit"])) { if($debug) echo "送信ボタンが押されました"; $pic_name = $_FILES["pic"]["name"]; $pic_tmp = $_FILES["pic"]["tmp_name"]; $new_dir = "path/";//保存先のディレクトリを指定してください $error_message = array(); $path = getcwd(); if (isset($_ENV["OS"]) && preg_match("/window/i", $_ENV["OS"])) { $path .= "\\"; } else { $path .= "/"; } if (strlen($pic_name)>0 && strlen($pic_tmp)>0) { if($debug) echo "送信されたファイル名{$pic_name}、一時ファイル名{$pic_tmp}"; if (is_uploaded_file($pic_tmp)) { if($debug) echo "{$pic_tmp}へアップロードされました"; if (!move_uploaded_file($pic_tmp, $new_dir .basename($pic_name))) { $error_message[] = "●自画像ファイルのアップロードに失敗しました"; }else{ if($debug) echo "アップロードに成功しました"; } }else{ if($debug) echo "{$pic_tmp}のアップロードに失敗しました。"; } }else{ if($debug) echo "ファイル名が空なのでアップロードに失敗しています"; } }else{ if($debug) echo "送信ボタンが押されていません"; } ?> <html> <form method="post" action="<?=$SERVER["PHP_SELF"]?>" enctype="multipart/form-data" > 画像のアップロードフォーム <input type="hidden" name="MAX_FILE_SIZE" value="100000"> <input type="file" name="pic" size="40"> <input type="submit" name="submit" value="送信" /> </html> /////////////////////////////////////////////////////
その他の回答 (1)
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
あんまり真剣にソースを読んでいませんが(汗、$newdirの部分がhttp://~となっているのが原因ではないでしょうか。これにはURLではなく、サーバ内の絶対パスか、このスクリプトファイルからの相対パスを指定する必要があります。(例 /var/www/hogehoge/uploaddir/) 表示やリンク自体はhttp://~でURL指定か相対パスで表示させる必要がありますが
補足
相対パスで記述を代えてみたのですが、まだうまくいきません(><) 他に考えられる問題は無いでしょうか?
補足
taketan_mydns_jpさんありがとうございます! とりあえず、アップロードには成功しました☆♪ そこで、また相対パスの話に戻るのですが、 ----------------------------------------------------------- ┳送信フォーム.php ┃ ┣[picフォルダ]━ 画像.jpg ----------------------------------------------------------- としたいのですが、今の状態ですと ----------------------------------------------------------- ┳送信フォーム.php ┣[picフォルダ] ┣ 画像.jpg ----------------------------------------------------------- となってしまうのです・・ 正しくフォルダ名picにアップロードしたい場合はどのように パスを記述すれば良いでしょうか? 今の所パスは $new_dir .= "\.\\pic\\"; もしくは $new_dir .= "pic\\"; とやってみて失敗でした(><;)