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

解決済みの質問

PHP重複ファイルに連番をつけてアップロードしたい

ファイルをアップロードするページをPHPで作りました。

testup.htmlでファイルを選択し、
testup.phpでファイルをサーバーにアップする
簡単な仕組みです。

アップロードには成功したのですが、
同じファイル名のデータがある場合、上書きされてしまいます。

上書きされずに、連番等をファイル名に追加してアップロード
できればと思いましたが、方法がわかりません。

当方PHPの初心者です。何卒お力をお貸しください。
よろしくお願い致します。

ソースを記入しておきます。
「testup.html」
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
</head>
<body>
テストアップローダー<br>
<form action="testup.php" method="post" enctype="multipart/form-data">
アップロードするファイルを選択してください。
<br>
<input type="file" name="upfile" size="30"><br>
<br>
<input type="submit" value="アップロード">
<label> 
<input type="reset" name="button" id="button" value="リセット" />
</label>
</form>
</body>
</html>

「testup.php」
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
</head>
<body>
<p><?php

if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) {
chmod("files/" . $_FILES["upfile"]["name"], 0777);
echo $_FILES["upfile"]["name"] . "をアップロードしました。";
echo "<br><br>ありがとうございました。";
echo "<br><FORM><INPUT TYPE=button value=閉じる onClick=window.close()></FORM>";

} else {
echo "ファイルをアップロードできません。";
echo "<br>お手数ですが前の画面に戻ってもう一度ファイルをアップロードしてください。";
echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>";
}
} else {
echo "ファイルが選択されていません。";
echo "<br>お手数ですが前の画面に戻ってファイルを選択してください。";
echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>";
}
?></p>
</body>
</html>

投稿日時 - 2009-06-17 11:22:30

QNo.5051045

困ってます

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

move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])

この$_FILES["upfile"]["name"]の後ろに「.date("YMDHis")」を追加してやれば、別ファイルとして認識されると思います。初心者ということであれば、こちらの方がお手軽かと思います。

連番の場合は、ディレクトリ内に同じファイルがあったら、ファイル数を取得して、$_FILES["upfile"]["name"]の後ろに追加してあげればよいと思います。ファイル数の取得については既出です。
http://okwave.jp/qa1758366.html

投稿日時 - 2009-06-17 11:46:53

お礼

nanasi1976さん

ご回答ありがとうございます。
無事、上書きされずにすみました。
感謝です!

一つ疑問なのですが、このdate情報を
拡張子の前に付けることはできますか?

投稿日時 - 2009-06-17 13:31:24

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

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

回答(4)

ANo.4

>私には難解すぎます
一部を除き、提示したサンプルはファイル操作の基本中の基本ですので、必ずマスターしてください。

それと、質問が解決したら、締め切ったほうがいいですよ。

投稿日時 - 2009-06-19 14:43:01

ANo.3

>連番の場合は、ディレクトリ内に同じファイルがあったら、ファイル数を取得して、$_FILES["upfile"]["name"]の後ろに追加してあげればよいと思います。

すみません。上記は無視してください。

アップロードされるファイルが常に同じ名前であれば、上書きされるときにcount.txtというファイルに上書き回数を記録するという手もありますが、現実的ではないと思うので、この方法も却下で・・・

c.f. 実現例(参考までに・・・)
$fp=fopen("count.txt","w+");
$current_count = fgets($fp);
if($current_count==""){
$current_count=0;
}
$count = $current_count+1;
fwrite($fp,$count);
fclose($fp);

投稿日時 - 2009-06-17 15:38:00

お礼

nanasi1976さん

上記にあります、

c.f. 実現例(参考までに・・・)
$fp=fopen("count.txt","w+");
$current_count = fgets($fp);
if($current_count==""){
$current_count=0;
}
$count = $current_count+1;
fwrite($fp,$count);
fclose($fp);

は私には難解すぎます・・・
テキストファイル化し、勉強しておきます。

ほんといろいろと教えていただきありがとうございました。

投稿日時 - 2009-06-17 15:54:10

ANo.2

>このdate情報を拡張子の前に付けることはできますか?
これくらいは自分で調べてほしいのですが、初心者ということでサービスしましょう。
「date("YMDHis").$_FILES["upfile"]["name"]」としてみてください。
# 個人的には、$file_name=$_FILES["upfile"]["name"];とワンクッション置いて、スーパーグローバル変数でのやり取りはしないようにしています。

投稿日時 - 2009-06-17 15:19:52

お礼

nanasi1976さん

ありがとうございます!!
無事ファイル名の前に付加されました!!

ほんとにいろいろありがとうございます。
もっと勉強して早く初心者からグレードアップしたいです!

ほんとにありがとうございました。

投稿日時 - 2009-06-17 15:51:20

あなたにオススメの質問