dポイントプレゼントキャンペーン実施中!

PHPで画像をアップロードしようとしています。
ファイル名を「000000_999999.jpg」というような感じにしたいです。
ファイル名の000000の部分は日付(080221等)が入ります。
999999の部分をどうしたら良いのか分かりません。
同時に5ファイルまでアップロードできるようなフォームになっています。
この場合で、絶対ダブらないようにするにはどのような値を使えば良いのでしょうか?
出来れば関数名も入れていただけると嬉しいです。
お願いいたします。

A 回答 (4件)

そうですねー、削除は、面倒ですねー。


・・・ちと、考え中・・・

もし、私が作るのなら、自分だけなら、排他処理は保留します。
もちろん、後で排他処理も使えるようにしますが、完成を先にしたいし。
排他処理は必須ではないと、考えます。

画像の保存方法は、
年月日フォルダ¥time() + 1(~5).jpg の方法をとります。
time()は前もって、時間を取得しているので、だぶらせません。

つまり、
$jikan = time(); //仮に値が 1203948113
$hiduke\$jikan-$no.jpg 具体的には、

080225\1203948113-1.jpg
080225\1203948113-2.jpg
080225\1203948113-3.jpg
080225\1203948113-4.jpg
080225\1203948113-5.jpg

複数の人が、同時にアクセスするのなら、排他処理は必要ですが、1人だけなら、次の画像アップまで、1秒くらいは待ちましょう。w
前回のアップロード時間を保存しておいて、1秒以内なら、エラー画面を出すって方法もありますが、複数の人が使う場合は、やはり排他処理が必要になってくる。

で、画像を削除する時は、そのまま削除。
アップロードする時に
1(1の画像) [     ][画像のアップボタン]
2(2の画像) [     ][画像のアップボタン]
3(画像なし) [     ][画像のアップボタン]
4(4の画像) [     ][画像のアップボタン]
5(5の画像) [     ][画像のアップボタン]

アップ画面は、こんな感じにします。
前詰めは、面倒なのでしません。
すでに画像があるものは、上書き保存してもいいし、”すでにある”とエラー画面を出してもいいです。

で、画像の表示画面ですが、表示段階で前に詰めようかと。
for 5回
 if (画像があれば ){表示}
 else{なければスルー。}

こうすれば、上の例だと、3をスルーして、あと全部表示にすれば、まぁ、私的な作成法です。

ただ、この方法だと、消した画像の所に画像を入れるので、一枚消して、最後に入れたい場合だと、面倒ですねー。
まぁ、消して、再度アップロードし直せば、いいだけですが。
この機能は、私は必要とは思わないけど、もし必要なら、後から名前を入れ替える関数を作ってもいいかなー、と。

プログラムには、いろいろな作成方法やポリシーがあるので、一概には言えません。
あなたなりのアイディアで、がんばってくださいね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
丁寧に書いていただき感謝いたします。
すごい分かりやすいです。モヤモヤしていたものが晴れました。
表示の時に空き番を詰めるってのもアリですね。
頂きました情報を参考にさせていただき作ってみたいと思います。
本当にありがとうございました。

お礼日時:2008/02/26 23:53

しくしく。

>w<。
誤って消してしまったので、詳しくは排他処理で調べてください。

1人で使うなら、080224(年月日フォルダ)¥time() + 1(~5).jpgでいいと思いますよ。
timeは一秒ごとなので、同じ人間が1秒以内に、ファイルをアップロードする事はなずないでしょう。
Linuxでも同じフォルダ内のファイル数の制限もありますし、多いと処理が遅くなるので。

複数で使う場合は、排他処理が必要になります。
カウンターなんかには、この処理がしてあるものも多いです。
排他処理をしなければ、ダブル可能性は少なからずあります。
No1さんの方法もありますし、私のように方法もあると思います。

要は、名前を付ける時と、保存する時には微妙にタイムラグがあります。
名前を付けた時、別の人がその名前で保存したとき、名前を付けた人とダブルのは、どんなに時間を精密にしても可能性が残ります。
なので、ファイルがあった場合は、名前を変える処理が必要って事です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
使うのは1人(1ユーザー)の予定です。
年月日フォルダ¥time() + 1(~5).jpgは私も良いと思ったのですが、末尾の1(~5)の連番が、1つファイル削除された時、番号を詰めるのが面倒かなと思いまして。
あと、「1秒以内に、ファイルをアップロードする事はなず」ってとこですが、HTMLフォームで<input type="file">が5個あるのですがこの場合だとダブりますよね。PHPで、ファイル名を決める直前でもダブる可能性は十分あり得ちゃいますよね。
いずれにしても、ファイルの存在チェックは必要なのですね。

お礼日時:2008/02/25 14:40

日付_ナンバーは必須なんですか?


Now_1-5ではダメなんでしょうか?
日付で分けたければ、フォルダーにしちゃうとか。
絶対だぶらない方法にすると、読み込む時に、分かりにくいような気も。

Now(現在時刻の秒表示ってこれだっけ)は、file_existかな?存在チェックをして、・・・、変数でflgを立てる方がいいか。
とにかく、何らかのチェックをして、先に処理されていたら、sleepしてNowの所を変えるようにするとか。

最近、PHPを触っていないので、勢いで書いてます。w
    • good
    • 0
この回答へのお礼

ありがとうございます。
日付_999999は必須というわけではないのですが、ファイルをアップした日時がある程度分かったほうがいいかなと思いまして。
現在時刻の秒ですが、どこまで(細かく)取得すればダブらないのでしょうか?

お礼日時:2008/02/22 14:11

tempnamを使うのは確実な方法のひとつだと思います


http://jp2.php.net/manual/ja/function.tempnam.php
とりあえず空のファイルを作ってから、それをuploadされたファイルで上書きする
http://jp2.php.net/manual/ja/function.move-uploa …
という方法はどうでしょうか

パーミッションが0600だとまずいケースもあると思うので、
必要に応じて0644や0666などに書き換えると良いと思います
    • good
    • 0
この回答へのお礼

ありがとうございます。
tempnamはどのようなファイル名になるのでしょうか。
一応、ある程度意味のあるファイル名にしたいのですが。
999999を時間にする場合、どの関数でどこまでの秒を取得すればダブらないのでしょうか。

お礼日時:2008/02/22 14:05

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