前回の質問で画像を保存できるようになったんですが、画像を上書きせずに、重複していたら、ユーザ名_連番.pngという風にやっていきたいとおもいまして、コードを書いてみました。
php
1// もし同じファイル名があったら 2if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/../users/icons/'.$app->me()->id.".png")){ 3 // ループ回数の変数 4 $nu; 5 // 使われていない数字までループを回す 6 for($i = 0; file_exists($_SERVER['DOCUMENT_ROOT'] . '/../users/icons/'.$app->me()->id."_".$i.".png") === true; $i++){ 7 // ループ回数を代入(使われていない数) 8 $nu = $i; 9 } 10 rename($_SERVER['DOCUMENT_ROOT'] . '/../users/icons/'.$app->me()->id.".png", $_SERVER['DOCUMENT_ROOT'] . '/../users/icons/'.$app->me()->id."_".$nu.".png"); 11} 12 13// ファイルデータからSHA-1ハッシュを取ってファイル名を決定し、ファイルを保存する 14$path = sprintf($_SERVER['DOCUMENT_ROOT'] . '/../users/icons/'.$app->me()->id.".png"); 15 if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $path)) { 16 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 17 } 18chmod($path, 0644);
もし、ファイルが投稿されて、ファイルを保存する祭に、同じファイル名のファイルがあったら、そのファイルに対してファイル名_連番.pngというふうに名前を変えて、保存したいです。そのあとに、送信された画像が、ファイル名.pngで保存できますよね
問題は、for文で使われていない数字まで回すところが上手くいきません。
###追記
php
1// もし同じファイル名があったら 2 $fname = $_SERVER['DOCUMENT_ROOT'] . '/../users/icons/'.$app->me()->id; 3 if(file_exists($fname.".png")){ 4 // フラグ 5 $flg = true; 6 // ループ回数の変数 7 $i = 1; 8 // 使われていない数字までループを回す 9 while($flg){ 10 if(!file_exists($fname.'_'.$i.'.png')){ 11 //重複する画像のリネーム処理 12 rename($fname.".png", $fname."_".$i.".png"); 13 //$fname.'_'.$i.'.png'でネーミング 14 $flg =false; 15 }else{ 16 // ループ回数増加 17 $i++; 18 } 19 } 20 } 21 22 // ファイルデータからSHA-1ハッシュを取ってファイル名を決定し、ファイルを保存する 23 $path = sprintf($_SERVER['DOCUMENT_ROOT'] . '/../users/icons/'.$app->me()->id.".png"); 24 if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $path)) { 25 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 26 } 27 chmod($path, 0644);
ソースコードをかなり削られたようですが・・・?png以外の拡張子は考えない感じですか?
はい。pngのみです。他のコードを削ったのは、うまくいかないのは、このループのみで、他に沢山書いてあるとややこしいので省きました。
他に沢山書いてある中に必要な情報があるかもしれないのに削るのは低評価のもとです。これだけではどういう流れで来ているのかわかりません。ややこしいかどうかは回答者側が判断する内容であって、質問者は出来る限りの情報を提示すべきです。それに前回の質問にもコメントがありましたが同名だが実態が画像ではない場合も考慮すべきとは思います(セキュリティ問題)
元の状態に戻します。ファイルの中のチェックはまだ追加できてません。この問題が解決できたら、後で付けます
回答1件
あなたの回答
tips
プレビュー