• ベストアンサー

ファイルアップ時のファイル名

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

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

  • ベストアンサー
noname#58606
noname#58606
回答No.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をスルーして、あと全部表示にすれば、まぁ、私的な作成法です。 ただ、この方法だと、消した画像の所に画像を入れるので、一枚消して、最後に入れたい場合だと、面倒ですねー。 まぁ、消して、再度アップロードし直せば、いいだけですが。 この機能は、私は必要とは思わないけど、もし必要なら、後から名前を入れ替える関数を作ってもいいかなー、と。 プログラムには、いろいろな作成方法やポリシーがあるので、一概には言えません。 あなたなりのアイディアで、がんばってくださいね。

NORI-AYU
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#58606
noname#58606
回答No.3

しくしく。>w<。 誤って消してしまったので、詳しくは排他処理で調べてください。 1人で使うなら、080224(年月日フォルダ)¥time() + 1(~5).jpgでいいと思いますよ。 timeは一秒ごとなので、同じ人間が1秒以内に、ファイルをアップロードする事はなずないでしょう。 Linuxでも同じフォルダ内のファイル数の制限もありますし、多いと処理が遅くなるので。 複数で使う場合は、排他処理が必要になります。 カウンターなんかには、この処理がしてあるものも多いです。 排他処理をしなければ、ダブル可能性は少なからずあります。 No1さんの方法もありますし、私のように方法もあると思います。 要は、名前を付ける時と、保存する時には微妙にタイムラグがあります。 名前を付けた時、別の人がその名前で保存したとき、名前を付けた人とダブルのは、どんなに時間を精密にしても可能性が残ります。 なので、ファイルがあった場合は、名前を変える処理が必要って事です。

NORI-AYU
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
noname#58606
noname#58606
回答No.2

日付_ナンバーは必須なんですか? Now_1-5ではダメなんでしょうか? 日付で分けたければ、フォルダーにしちゃうとか。 絶対だぶらない方法にすると、読み込む時に、分かりにくいような気も。 Now(現在時刻の秒表示ってこれだっけ)は、file_existかな?存在チェックをして、・・・、変数でflgを立てる方がいいか。 とにかく、何らかのチェックをして、先に処理されていたら、sleepしてNowの所を変えるようにするとか。 最近、PHPを触っていないので、勢いで書いてます。w

NORI-AYU
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

tempnamを使うのは確実な方法のひとつだと思います http://jp2.php.net/manual/ja/function.tempnam.php とりあえず空のファイルを作ってから、それをuploadされたファイルで上書きする http://jp2.php.net/manual/ja/function.move-uploaded-file.php という方法はどうでしょうか パーミッションが0600だとまずいケースもあると思うので、 必要に応じて0644や0666などに書き換えると良いと思います

NORI-AYU
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPを使用しHTMLのファイル名を・・・

    PHPを使用しHTMLのファイル名をソースに書き込みたいと 思っているのですがどのようにすれば良いのか分からずにいます。 例えば ファイル名が 01.html~99.html まであるとして 今のページ数をHTMLの中に書き込みたいと思っています。 (01.htmlの場合は1ページ目ですといった感じにしたいと思っています。) また01.htmlのソースの中に画像を参照している部分があり001.htmlの場合 01.jpgを参照しているのですがその部分もファイル名からPHPを使用し 自動的に抽出し組み込む方法も探しています。 どなたかPHPでどうすれば出来るかご存知の方いましたら宜しく お願いいたします<(_ _)>

    • ベストアンサー
    • PHP
  • ファイルがdataフォルダにうまくアップできなくて困っています。

    htmlフォームにより、ファイルをアップロードして、 それをphpが受け取ったファイルのファイル名を、 拡張子のみそのまま利用してファイル名は 日付けと時間をdate関数を利用して つけるようにしました。 GetExt関数は、アップされた画像の拡張子のみを取得する自作関数です。 以下のスクリプトを実行しても同一階層にあるdataフォルダに写真がアップされなくて悩んでいます。 アドバイスお願い致します。 <html> <body> <table border=1> <form method="post" action="<?php echo($_SERVER["PHP_SELF"])?>" ENCTYPE="MALTIPART/FORM-DATA"> <tr><TD><INPUT TYPE="FILE" NAME="FILE" SIZE=40></TD></tr> <tr><td><input type=submit value=送信></td></tr> </table> <?php if($_FILES["FILE"]["tmp_name"] != ""){ $FilePath = "./data/" . date("YmdHis") . "." . GetExt($_FILES["FILE"]["name"]); move_uploaded_file($_FILES["FILE"]["tmp_name"],$FilePath); }else{ echo("失敗しました!"); } //GetExt()関数の定義 //ファイル名から拡張子だけを取得する関数 function GetExt($FilePath){ $f = strrev($FilePath); $ext = substr($f,0,strpos($f,".")); return strrev($ext); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • ファイルアップローダーで送信するファイルを保存する際にファイル名に自動でURLパラメーターを入れ込む方法を教えてください。

    phpの超初心者です。 phpでファイルをブラウザ上でアップロードするシステム でかつ、 アップロード用のURLにhttp://www.hogehoge.com/up.php?no=1234などのパラメーターを付けてアップロードするファイルを「1234.jpg」という名前で保存するものが必要になり色々調べました。 以下の方法だとアップロードしたファイル名が「.jpg」になってしまいます。 $count_fileに単純な文字列、'image'などを入れるとちゃんと「image.jpg」としてアップロードできます。 <form action="<?= $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data"> <p><input type="file" name="data" /> <input type="submit" value="アップロード"></p> </form> <?php $updir = "./data"; $tmp_file = @$_FILES['data']['tmp_name']; $count_file = $_GET['no']; @list($file_name,$file_type) = explode(".",@$_FILES['data']['name']); $copy_file = $count_file . "." . $file_type; move_uploaded_file($tmp_file,"$updir/$copy_file"); ?> パラメーターなどの環境変数をファイル名に入れ込むにはどうしたらよいのでしょうか?調べ方が悪いのか、検索しまくってもわからなくて困っています。 どなたかご教授いただけませんでしょうか?

    • ベストアンサー
    • PHP
  • 複数の画像からランダム抽出して、自動でそのファイル名を変更して、アップできる?

    すいません、プログラミングとか超初心者です。 A.jpg B.jpg C.jpg 例えば上記のようにサーバー上にある3つの画像ファイルからランダムに1ファイル抽出してそれを自動でD.jpgというファイル名に変換して(「D」はこちらで指定)サーバー上にアップロードすることは可能でしょうか?

  • ブラウザ上でファイルをアップロードさせるCGIでファイル名を指定

    http://www.tohoho-web.com/cgi/wwwupl2.txt ↑このCGIを利用して、ファイルのアップロードが出来るようになったのですが、アップロードされたファイル名をこちらで指定したファイル名に変更させることは出来ますか? 例えば10個のファイルをアップロードした場合、001.jpg、002.jpg、.....010.jpgというように。 アップロードされたファイルをフラッシュで読み込みたいというのが目的です。

    • 締切済み
    • CGI
  • フォーム追加

    ログイン機能をつけた、ユーザー自身がアップロードするサイトを作っています。 このようなフォームをボタンで追加したり削除したりするには普通、jsを使うと思いますが、phpのクラス class form のようにして画像のようにフォームを増減させることはできますか? もしできる場合、簡単なロジック(方針)を教えて下さい。 なお、フォームには 1.アップロードするファイルのタイトル 2.ファイルの説明 3.ファイル(アップロードするファイル名は私自身で、アップロード者、日付等をディレクトリやファイル名にして、セキュリティに配慮しています。) の3つを入れたいです。

    • ベストアンサー
    • PHP
  • 画像アップロードのファイル名はハッシュ以外でも可?

    画像アップロード時のファイル名を、ハッシュ値に書きかえている実装をよく見るのですが、あれって別にハッシュじゃなくても良いのでしょうか? ・例えば、下記URLにアップロードする際、画像ファイル名を(容易に推測されやすい)256.jpgに書き変えると、セキュリティ的にマズいのでしょうか? <URL例> ・http://〇〇/256.php ■分からない点 ・「ブラウザから渡されたファイル名は汚染リスクがある」と書いてあったのですが、この意味は、「ブラウザから渡されたファイル名をそのまま使用してはいけない」ということだけでしょうか? ・書きかえるファイル名は何でも良い? ・上記のように、推測されやすいファイル名でも問題ない? ■質問背景 ・ファイル名をハッシュ値に書き換えると、FTPとかで確認する際やりづらいかなと思い、質問しました

    • ベストアンサー
    • PHP
  • ファイルの有無を調べる

    毎日アップロードされる、ファイル名に日付が付いた画像をブルダウンメニューから日付を選択して表示するといったスクリプトを作っています。 スクリプトはほぼ完成したのですが、一部画像が欠落している日もあるのでその日付を自動であらかじめ調べるようにしたいと思っています。 そこでお尋ねしたいのですが、 HTTPサーバ上で指定したアドレスのファイル(例:http://www.exdomain.com/example.jpg)があるかどうか調べる方法はありますか。 よろしくお願いします。

  • テキストファイルを経由しての画像呼び出し

    はじめまして。 PHPをはじめてまだ間もない者ですが、行き詰ってしまいましたのでご質問させていただきたいと思います。 画像をアップロードする時に backimg.txt という名前でファイル名を取得しているのですが それを利用して画像を呼び出そうとしているのですがどうにも表示してくれません。 表示どころか、エラーが出てしまいます… ファイル構成・PHP部分は以下の通りです。 public_html ├─ index.php  ←ここの一部のプログラムです ├─  ・ ├─  ・ └─ background_img     ├─ backimg.txt  アップロードしたファイル名が記述     └─ test.jpg   アップロードした画像 <?php if(file_exists("background_img/backimg.txt")){ $fp = fopen("background_img/backimg.txt","r") or die("ファイルのオープンに失敗しました"); $buff = fgets($fp); fclose($fp); } echo'<img src="'.$buff.'" border="0">'; ?> ※この $buff = fgets($fp); の部分でエラーが出ます。 backimg.txt内の文字(UPする度、この一行を上書きしていってます) ──────────────────   background_img/test.jpg ────────────────── ※PHPでアップロードした画像は  background_img フォルダに入るようになっています。 ※画像名はまちまち変わりますので、 test.jpg 固定ではありません。 ※データベースを使えないサーバを利用しております。 以上の条件でどうやったら解決できるのか、 お手数おかけいたしますが、教えていただければ幸いに思います。

    • ベストアンサー
    • PHP
  • 日付に基づいたファイル名を自動で表示させたい

    ライブカメラのJPG画像があります。 自動生成される画像名は、日付+連番(0602001.jpgのような)で作成されるとします。 <img src="xxxxx.jpg">で表示させたい場合、xxxxxにはJavascriptで次々と変わるファイル名を持ってくるためにはどうしたらよいでしょうか? 日付情報はJavascriptでパソコンの日付を持ってくる方法でOKです。どなたかソースを考案、もしくは参考サイトを教えていただけないでしょうか? よろしくお願いします!!

このQ&Aのポイント
  • EP-879ABでヘッドクリーニングをしても終わらない問題について相談です。
  • クリーニング中 終了するまで(約3分間)電源を切らないでくださいと表示されたまま一時間以上経っても終わりません。
  • どうすればヘッドクリーニングを完了させることができますか?
回答を見る