アプリ版:「スタンプのみでお礼する」機能のリリースについて

送信フォームを使って画像をアップロードさせたいのですが、うまくいきません。ブラウザ上でエラー表示は出ないのですが、移動させたいディレクトリにファイルが入って来ない状況です。
初心者なので、参考書を片手に例文をカスタマイズしていったので、アルゴリズム自体がどこか間違っているかもしれないです。
特に下記ソースコード中の
『$path = getcwd();~』
の辺りで、スクリプトのあるディレクトリパスを取得して、パスの末尾に"¥"or"/"を追加しているのは理解出来るのですが、
そもそも何のスクリプトのパスを取得しているのかが解らず、
結局テンポラリディレクトリからの移動先ディレクトリを自分で$new_dirと定義してmove_uploaded_file()しています。
どなたか詳しい方いらっしゃいましたらご教示宜しくお願いします!
===========ソースコード===============
<?php
if (isset($_POST["submit"])) {
//-------------------------------------------------------------------------
//■クライアントから取得する元ファイル名を$pic_name、
//■テンポラリディレクトリ名を$pic_tmp
//■テンポラリディレクトリからの移動先ディレクトリを$new_dir
//-------------------------------------------------------------------------
$pic_name = $_FILES["pic"]["name"];
$pic_tmp = $_FILES["pic"]["tmp_name"];
$new_dir = "http://xxx.com/pic/";

//----------------------------------------------------------------------------------
//■エラーメッセージは配列に追加
//----------------------------------------------------------------------------------
$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 (is_uploaded_file($pic_tmp)) {
//----------------------------------------------------------------------------------
//■ファイルを移動
//----------------------------------------------------------------------------------
if (!move_uploaded_file($pic_tmp, $new_dir .basename($pic_name))) {
$error_message[] = "●自画像ファイルのアップロードに失敗しました";
}
}
}
}
?>

<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">
</html>

A 回答 (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>
/////////////////////////////////////////////////////

この回答への補足

taketan_mydns_jpさんありがとうございます!
とりあえず、アップロードには成功しました☆♪
そこで、また相対パスの話に戻るのですが、
-----------------------------------------------------------
┳送信フォーム.php

┣[picフォルダ]━ 画像.jpg
-----------------------------------------------------------
としたいのですが、今の状態ですと
-----------------------------------------------------------
┳送信フォーム.php
┣[picフォルダ]
┣ 画像.jpg
-----------------------------------------------------------
となってしまうのです・・
正しくフォルダ名picにアップロードしたい場合はどのように
パスを記述すれば良いでしょうか?
今の所パスは
$new_dir .= "\.\\pic\\";
もしくは
$new_dir .= "pic\\";
とやってみて失敗でした(><;)

補足日時:2007/09/14 16:09
    • good
    • 0

あんまり真剣にソースを読んでいませんが(汗、$newdirの部分がhttp://~となっているのが原因ではないでしょうか。

これにはURLではなく、サーバ内の絶対パスか、このスクリプトファイルからの相対パスを指定する必要があります。(例 /var/www/hogehoge/uploaddir/)
表示やリンク自体はhttp://~でURL指定か相対パスで表示させる必要がありますが

この回答への補足

相対パスで記述を代えてみたのですが、まだうまくいきません(><)
他に考えられる問題は無いでしょうか?

補足日時:2007/09/14 02:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!