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

ファイルアップロードの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>";
}
}
}

A 回答 (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>";
}
}
}
    • good
    • 0
この回答へのお礼

出来ました!!
わざわざ動作確認までしていただき本当にありがとうございました。
今回教えていただいたことを参考に勉強していきたいと思います。
ありがとうございました。

お礼日時:2004/09/10 20:21

あー、ええと、私の書いたソースは、


$formdata{'savefile'} が ファイル名のみで、ディレクトリなどの情報が入っている場合は不具合が起こります。
その上、ファイル名が、 xxx.cgi.txt のように ドットが一つ以上入っている場合にも不具合が起きます。

そこを修正していただければ直るとは思います。


# 大体 use lib './lib'; とか use CGI_Lite; とか使ったことがないし(調べれば分かるんだろうが、そこまでの気力がない)
# 個人的には cgi-lib.plでのアップロードしか経験ないです。
    • good
    • 0

・具体的にどこからどこまで上書きをしたのか?


・ページが表示できません。になったときに、エラーチェックはしたのか?
・エラーチェックが出ている場合どこでエラーが出ているのか分かっているのか?
・変数は適宜に変更したのか。
など、もう少し詳しく教えてください。

というのも意地悪なので、以下にどこをどのように変更するのかを書いてみました。

インデントを全角スペースでやっているので、
これは削除してください。(エラーになります)

ちなみに動作チェックはまったくしてないので動かないかも知れません。


# 同名のファイルがある場合、削除権限があれば上書き
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>";
}

補足日時:2004/09/10 14:32
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
moon_nightさんのおかげでエラーもなく表示されるようになりました。
しかし、同じファイルをアップロードした場合ログでは”ファイルを保存しました”となるのですが実際は以前のファイルのまま上書き保存も削除もされていません。
ファイル名の違うファイルは問題なく保存されています。

同じファイルをアップロードした時のログです。

ファイルアップロードを処理しています。
 WalRack.cgi.txtを保存しました。
同じファイルが存在します 既存のWalRack.cgi.txtを削除しました。

違うファイルをアップロードした時のログです。

ファイルアップロードを処理しています。
 WalRack.cgi.txtを保存しました。

sjisとかeucとか色々変えてみたのですがダメでした。
ご指導よろしくお願いいたします。

お礼日時:2004/09/10 13:53

if ($upload) {



の重複チェックのところ

if (-e $formdata{'savefile'}) {


から差し替えればよいかと思います。

この回答への補足

h**p://updown.coolnavi.com/inline/47770.txt

補足日時:2004/09/10 11:06
    • good
    • 0
この回答へのお礼

if (-e $formdata{'savefile'}) から上書きしたのですが。ページが表示できません。になってしまいました。
初心者なものですいません。
もう少し詳しく教えてください。

お礼日時:2004/09/10 10:56

とりあえずファイル名だけ取り出します。


$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;
}
}
}

のようにすればいいのかと思います。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
いろいろ試したのですが、上記のソースをどの辺に入れてやれば良いのかわかりません。
ご指導よろしくお願いします。

お礼日時:2004/09/10 09:06

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