こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルのアップロードについて

phpのmove_uploaded_fileを使用してアップロードをしようと思うのですがアップロードが出来ません。
状況は
ローカル環境のwindowsでのアップロードは行えるがlinuxでは失敗してしまいます。
move_uploaded_fileからはエラーは出力されていません
そもそもmove_uploaded_fileが成功しているのになんでアップロードされていないのか分かりません。

//■HTML
<form name="form1" method="post" action="upload.php" ENCTYPE="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="10485760" />
<table class="frm" id="tbl">
<tr><th>ファイル1<div id="image"></div></th>
<td>
画像<input id="img_1" type="file" name="image[]" class="fname" onChange=imageChange(this); /><br />
</td></tr>
<tr>
<th>ファイル2<div id="image"></div></th>
<td>
画像<input id="img_2" type="file" name="image[]" class="fname" onChange=imageChange(this); /><br />
</td> </tr>
</table>
</form>


//■phpで以下のコードを実行すると
oreach ($_FILES["image"]["error"] as $key => $error) { //複数のファイルをアプロード
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["image"]["tmp_name"][$key]; //テンポラリファイルパス
$name = $_FILES["image"]["name"][$key]; //アップロードファイル名
$size = $_FILES["image"]["size"][$key]; //アップロードファイルサイズ
$ermsg = $_FILES['image']['error'][$key]; //エラーメッセージ
echo "アップロードファイル名".$name."\n" ;
echo "アップロードファイルsize" .$size ."\n" ;
echo "errmsg= .$ermsg."\n" ;
// ファイルアップロード
$cnt++;
if ( move_uploaded_file($tmp_name, "../1/33/.$cnt."2upload.jpg
")){ //ファイルアップロード
echo "アップロード成功 .$ermsg."\n" ;
echo "  テンポラリファイル="$tmp_name."\n";
echo "  アップロードファイル="$dir_img."/".$cnt.UPLOAD_FILE_NAME."\n";
} else {
echo 1;
error_log("upload error! \n", 3, MATCHING_ERROR_LOG);
exit;
}
}

}
exit;

■結果
アップロードファイル名thum6.jpg
アップロードファイルsize=10104
errmsg= 0
アップロード成功
  テンポラリファイル=/tmp/phpMvCzgo
  アップロードファイル=../1/33/1upload.jpg

アップロードファイル名 thum3.jpg
アップロードファイルsize=11528
errmsg= 0
アップロード成功
  テンポラリファイル=/tmp/php5Q4kIL
  アップロードファイル=../1/33/2upload.jpg

テンポラリの/tmpは777のため権限に問題ないです
php.iniの設定
upload_max_filesize=2m post_max_size=8m memory_limit=128m
今回のアップロードファイルのサイズから問題なし
file_uploads=onなので問題ありませんでした

これでなにかわかる方いらっしゃいましたら教えてください。

投稿日時 - 2011-02-27 16:55:39

QNo.6554455

困ってます

質問者が選んだベストアンサー

大きく2つ述べておきます。
大1.
ソースが整理されていないし文法エラーもあります。
この部分
if ( move_uploaded_file($tmp_name, "../1/33/.$cnt."2upload.jpg ←""の閉じ具合がおかしい
")){ //ファイルアップロード
echo "アップロード成功 .$ermsg."\n" ; ←""の閉じ具合がおかしい
echo "  テンポラリファイル="$tmp_name."\n"; ←.が足りない
echo "  アップロードファイル="$dir_img."/".$cnt.UPLOAD_FILE_NAME."\n"; ←.が足りない

私であれば修正を最小限にしつつ次のように書くかな。
$lastname = $dir_img."/".$cnt.UPLOAD_FILE_NAME;
if ( move_uploaded_file($tmp_name, $lastname) ){ //ファイルアップロード
echo "アップロード成功" .$ermsg."<br />\n" ;
echo "  テンポラリファイル=".$tmp_name."<br />\n";
echo "  アップロードファイル=".$lastname."<br />\n";

まあアップロード成功メッセージまで行っているようなのでソースの写し間違い箇所
もあるかもしれませんが、それはそれで注意していただきたいものです。
とにかくmove_uploaded_file()の引数と、その後のecho対象が違う方式で書かれているのが
気になります。
ご本人は同じつもりでしょうが、同じものは同じ変数(ここでは$lastname)に整理
しておいたほうがしょうもないミスを防ぐことができてよいと思います。

大2.
ファイルの探し方の問題かもしれませんね。
アップロード成功メッセージまで行っているんですからどこかにファイルが出来て
いるはずです。
まさかと思うようなところまで探してみましょう。
それに際しアドバイスがいくつかあります。
(1)Linuxのfindコマンドを駆使しましょう。可能なら一番上の/から探しましょう。
(2)何らかの理由で.で始まるファイル名になっていた場合lsでは見れないので
ls -aで見ましょう。
もしそうだったらファイル名の先頭に.がつかないようにソースを見直しましょう。
(3)ファイル名に$cntを付加したりファイル名を変更したりするのを一旦やめて
元のファイル名でアップロードした方がファイルが探しやすいかも

投稿日時 - 2011-03-03 10:45:19

お礼

アドバイスありがとうございます。。
返事がかなり遅くなりもうしわけありません

本件につきましては自己解決することができました。

私のしらないソースがあり。後続処理にてアップロードしたファイルを別名退避後に削除していました。

投稿日時 - 2011-04-10 18:48:27

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問