- ベストアンサー
ファイルアップロード時の重複ファイル名の処理方法
- 重複ファイル名の場合、ファイル名の末尾に番号をつける方法について
- ファイルアップロードの処理時に重複するファイル名を上書きせず、番号を付与する方法について
- 上書きされないようにするためのファイルアップロード時の処理方法について
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
結局動作確認までしてしまった・・・ # ファイル受信時の処理 sub file_receive { $form_log .= "ファイルアップロードを処理しています。<br>"; if ($upload) { # 同名のファイルがある場合、削除権限があれば上書き if (-e $formdata{'savefile'}) { # もしかしたらファイル名をsjisに変えなくてはいけないかも(その場合コメントをとる) #$formdata{'savefile'} = &jcode::sjis ($formdata{'savefile'}); # ファイル名と拡張子を分ける (@file_) = split(/\./,$formdata{'file'}); $file_num = 0; $file_num2 = @file_; foreach $file_ (@file_) { $file_num++; if ($file_num2 == $file_num) { $file2 = $file_; } else { if ($file_num != 1) { $file1 .= "."; } $file1 .= $file_; } } # ループ for(1..100){ # ファイル名に数字を足す $formdata{'file'} = $file1 .$_ ."." .$file2; $formdata{'savefile'} = $directory.'/'.$formdata{'file'}; # もしかしたらファイル名をEUCに戻さないといけないかも #$formdata{'savefile'} = &jcode::euc ($formdata{'savefile'}); # ファイルの存在チェック if (-e $formdata{'savefile'}) { next; } else { # 保存(リネーム)処理 if (rename $formdata{'tempfile'}, $formdata{'savefile'}) { chmod $permission, $formdata{'savefile'} if ($permission); $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .=" ".$formdata{'file'}."を保存しました。<br>"; } last; } } } else { # 保存(リネーム)処理 if (not -e $formdata{'savefile'}) { if (rename $formdata{'tempfile'}, $formdata{'savefile'}) { chmod $permission, $formdata{'savefile'} if ($permission); $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .=" ".$formdata{'file'}."を保存しました。<br>"; } } } } else { # アップロード権限がない場合 $form_log .= " ファイルアップロードの権限がありません。<br>"; } # アップロード失敗時 if (-e $formdata{'tempfile'}) { $form_log .= " ファイルアップロードに失敗しました。<br>"; if (unlink $formdata{'tempfile'}) { $formdata{'tempfile'} = &jcode::euc ($formdata{'tempfile'}); $form_log .= " 一時ファイル".$formdata{'tempfile'}."は破棄されました。<br>"; } else { $formdata{'tempfile'} = &jcode::euc ($formdata{'tempfile'}); $form_log .= " 一時ファイル".$formdata{'tempfile'}."を破棄できませんでした。<br>"; } } }
その他の回答 (4)
- moon_night
- ベストアンサー率32% (598/1831)
あー、ええと、私の書いたソースは、 $formdata{'savefile'} が ファイル名のみで、ディレクトリなどの情報が入っている場合は不具合が起こります。 その上、ファイル名が、 xxx.cgi.txt のように ドットが一つ以上入っている場合にも不具合が起きます。 そこを修正していただければ直るとは思います。 # 大体 use lib './lib'; とか use CGI_Lite; とか使ったことがないし(調べれば分かるんだろうが、そこまでの気力がない) # 個人的には cgi-lib.plでのアップロードしか経験ないです。
- moon_night
- ベストアンサー率32% (598/1831)
・具体的にどこからどこまで上書きをしたのか? ・ページが表示できません。になったときに、エラーチェックはしたのか? ・エラーチェックが出ている場合どこでエラーが出ているのか分かっているのか? ・変数は適宜に変更したのか。 など、もう少し詳しく教えてください。 というのも意地悪なので、以下にどこをどのように変更するのかを書いてみました。 インデントを全角スペースでやっているので、 これは削除してください。(エラーになります) ちなみに動作チェックはまったくしてないので動かないかも知れません。 # 同名のファイルがある場合、削除権限があれば上書き if (-e $formdata{'savefile'}) { $formdata{'savefile'} = &jcode::sjis ($formdata{'savefile'}); $form_log .= "同じファイルが存在します"; if ($delete) { if (unlink $formdata{'savefile'}) { $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除しました。<br>"; } else { $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除できませんでした。<br>"; } } else { $form_log .= " 上書きには、削除権限が必要です。<br>"; } } # 保存(リネーム)処理 if (not -e $formdata{'savefile'}) { if (rename $formdata{'tempfile'}, $formdata{'savefile'}) { chmod $permission, $formdata{'savefile'} if ($permission); $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .=" ".$formdata{'file'}."を保存しました。<br>"; } } ↓ # 同名のファイルがある場合、削除権限があれば上書き if (-e $formdata{'savefile'}) { # もしかしたらファイル名をsjisに変えなくてはいけないかも(その場合コメントをとる) #$formdata{'savefile'} = &jcode::sjis ($formdata{'savefile'}); # ファイル名と拡張子を分ける ($file1,$file2) = split(/./,$formdata{'savefile'}); # ループ for(1..100){ # ファイル名に数字を足す $formdata{'savefile'} = $file .$_ ."." .$file2; # もしかしたらファイル名をEUCに戻さないといけないかも #$formdata{'file'} = &jcode::euc ($formdata{'file'}); # ファイルの存在チェック if (-e $formdata{'savefile'}) { next; } else { # 保存(リネーム)処理 if (rename $formdata{'tempfile'}, $formdata{'savefile'}) { chmod $permission, $formdata{'savefile'} if ($permission); $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .=" ".$formdata{'file'}."を保存しました。<br>"; } last; } } $formdata{'savefile'} = &jcode::sjis ($formdata{'savefile'}); $form_log .= "同じファイルが存在します"; if ($delete) { if (unlink $formdata{'savefile'}) { $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除しました。<br>"; } else { $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除できませんでした。<br>"; } } else { $form_log .= " 上書きには、削除権限が必要です。<br>"; } } else { # 保存(リネーム)処理 if (not -e $formdata{'savefile'}) { if (rename $formdata{'tempfile'}, $formdata{'savefile'}) { chmod $permission, $formdata{'savefile'} if ($permission); $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .=" ".$formdata{'file'}."を保存しました。<br>"; } } }
お礼
お返事ありがとうございます。 moon_nightさんのおかげでエラーもなく表示されるようになりました。 しかし、同じファイルをアップロードした場合ログでは”ファイルを保存しました”となるのですが実際は以前のファイルのまま上書き保存も削除もされていません。 ファイル名の違うファイルは問題なく保存されています。 同じファイルをアップロードした時のログです。 ファイルアップロードを処理しています。 WalRack.cgi.txtを保存しました。 同じファイルが存在します 既存のWalRack.cgi.txtを削除しました。 違うファイルをアップロードした時のログです。 ファイルアップロードを処理しています。 WalRack.cgi.txtを保存しました。 sjisとかeucとか色々変えてみたのですがダメでした。 ご指導よろしくお願いいたします。
補足
このソースを削除したら保存されるようになりました。しかし、fileというフォルダの中にアップロードしたファイルが保存されるはずなんですがcgiのファイルを置いてあるところに保存されてしまいます。 それとファイル名がWalRack.txtなのですが拡張子も何もない数字の1,2、3・・・となってしまいます 。何かやり方が間違っているのでしょうか。 ちなみに最初にアップロードしたWalRack.txtは上書き保存もファイル名も変更にはなっていません。 よろしくお願いします。 $formdata{'savefile'} = &jcode::sjis ($formdata{'savefile'}); $form_log .= "同じファイルが存在します"; if ($delete) { if (unlink $formdata{'savefile'}) { $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除しました。<br>"; } else { $formdata{'file'} = &jcode::euc ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除できませんでした。<br>"; } } else { $form_log .= " 上書きには、削除権限が必要です。<br>"; }
- moon_night
- ベストアンサー率32% (598/1831)
if ($upload) { の重複チェックのところ if (-e $formdata{'savefile'}) { から差し替えればよいかと思います。
お礼
if (-e $formdata{'savefile'}) から上書きしたのですが。ページが表示できません。になってしまいました。 初心者なものですいません。 もう少し詳しく教えてください。
補足
h**p://updown.coolnavi.com/inline/47770.txt
- moon_night
- ベストアンサー率32% (598/1831)
とりあえずファイル名だけ取り出します。 $file_name = file.txt; # ファイル存在チェック if (-e $file_name) { # ファイル名と拡張子を分ける ($file1,$file2) = split(/./,$file_name); # ループ for(1..100){ # ファイル名に数字を足す $file_name = $file .$_ ."." .$file2; # ファイルの存在チェック if (-e $file_name) { next; } else { last; } } } のようにすればいいのかと思います。
お礼
お返事ありがとうございます。 いろいろ試したのですが、上記のソースをどの辺に入れてやれば良いのかわかりません。 ご指導よろしくお願いします。
お礼
出来ました!! わざわざ動作確認までしていただき本当にありがとうございました。 今回教えていただいたことを参考に勉強していきたいと思います。 ありがとうございました。