ファイルアップロードのcgiで、上記題名の通り重複するファイル名を上書きするのではなく、重複するファイル名の末尾に番号をつけ上書きされないようにしたいのですが、どのように変更すれば良いのでしょうか教えてください。
# ファイル受信時の処理
sub file_receive {
$form_log .= "ファイルアップロードを処理しています。<br>";
if ($upload) {
# 同名のファイルがある場合、削除権限があれば上書き
if (-e $formdata{'savefile'}) {
$formdata{'savefile'} = ($formdata{'savefile'});
$form_log .= "同じファイルが存在します";
if ($delete) {
if (unlink $formdata{'savefile'}) {
$formdata{'file'} = ($formdata{'file'});
$form_log .= " 既存の".$formdata{'file'}."を削除しました。<br>";
} else {
$formdata{'file'} = ($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'} = ($formdata{'file'});
$form_log .=" ".$formdata{'file'}."を保存しました。<br>";
}
}
}
No.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>";
}
}
}
出来ました!!
わざわざ動作確認までしていただき本当にありがとうございました。
今回教えていただいたことを参考に勉強していきたいと思います。
ありがとうございました。
No.4
- 回答日時:
あー、ええと、私の書いたソースは、
$formdata{'savefile'} が ファイル名のみで、ディレクトリなどの情報が入っている場合は不具合が起こります。
その上、ファイル名が、 xxx.cgi.txt のように ドットが一つ以上入っている場合にも不具合が起きます。
そこを修正していただければ直るとは思います。
# 大体 use lib './lib'; とか use CGI_Lite; とか使ったことがないし(調べれば分かるんだろうが、そこまでの気力がない)
# 個人的には cgi-lib.plでのアップロードしか経験ないです。
No.3
- 回答日時:
・具体的にどこからどこまで上書きをしたのか?
・ページが表示できません。になったときに、エラーチェックはしたのか?
・エラーチェックが出ている場合どこでエラーが出ているのか分かっているのか?
・変数は適宜に変更したのか。
など、もう少し詳しく教えてください。
というのも意地悪なので、以下にどこをどのように変更するのかを書いてみました。
インデントを全角スペースでやっているので、
これは削除してください。(エラーになります)
ちなみに動作チェックはまったくしてないので動かないかも知れません。
# 同名のファイルがある場合、削除権限があれば上書き
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>";
}
}
}
この回答への補足
このソースを削除したら保存されるようになりました。しかし、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さんのおかげでエラーもなく表示されるようになりました。
しかし、同じファイルをアップロードした場合ログでは”ファイルを保存しました”となるのですが実際は以前のファイルのまま上書き保存も削除もされていません。
ファイル名の違うファイルは問題なく保存されています。
同じファイルをアップロードした時のログです。
ファイルアップロードを処理しています。
WalRack.cgi.txtを保存しました。
同じファイルが存在します 既存のWalRack.cgi.txtを削除しました。
違うファイルをアップロードした時のログです。
ファイルアップロードを処理しています。
WalRack.cgi.txtを保存しました。
sjisとかeucとか色々変えてみたのですがダメでした。
ご指導よろしくお願いいたします。
No.2
- 回答日時:
if ($upload) {
の重複チェックのところ
if (-e $formdata{'savefile'}) {
から差し替えればよいかと思います。
if (-e $formdata{'savefile'}) から上書きしたのですが。ページが表示できません。になってしまいました。
初心者なものですいません。
もう少し詳しく教えてください。
No.1
- 回答日時:
とりあえずファイル名だけ取り出します。
$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;
}
}
}
のようにすればいいのかと思います。
お返事ありがとうございます。
いろいろ試したのですが、上記のソースをどの辺に入れてやれば良いのかわかりません。
ご指導よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Firefox で file:// で始まる U...
-
巨大なテキストの最終行を取得...
-
【C++/CLI】ファイルオープンに...
-
重複ファイル名ある場合ファイ...
-
drtファイルはどうしたら開...
-
window.open でのファイル指定方法
-
MP3情報の表示
-
python renameについて
-
perlでMail::Mbox::MessagePars...
-
fgets で値が取得できない
-
ランダムスクリプトに時間要素...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
batファイルでrenameができませ...
-
ExcelをCSV書き出す場合のシー...
-
awkスクリプトでダブルクォーテ...
-
DOSコマンドで、標準出力を出力...
-
ファイル出力の改行コードをLFに
-
Perlの変数に文字数制限(容量...
-
fopenでディレクトリ内の全ファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python renameについて
-
fgets で値が取得できない
-
window.open でのファイル指定方法
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
read() on unopened filehandle...
-
csvファイルの横方向への改行に...
-
VBAコードを張り付け後のエクセ...
-
Firefox で file:// で始まる U...
-
JSP URLに表示される拡張子 .jsp
-
drtファイルはどうしたら開...
-
重複ファイル名ある場合ファイ...
-
並び方、
-
VBA テキストファイルを読み取...
-
cgiでサーバーにファイルを追加...
-
HTMLのフォームで画像と文...
-
WindowsでPerlをする際,1行目の...
-
バイナリファイルの出力
-
Perlでのパーミッション変更の仕方
-
foreach内での変数の扱い?
おすすめ情報