IEでアップするとファイル名にパス名が含まれしまう

IEでアップするとファイル名にパス名が含まれしまい、IEでは表示されなくなる問題あり

参考サイト
http://plaza.rakuten.co.jp/hknopage/diary/200901070000/

以下引用*********************

今日もせかせかperlで開発。

ファイルのアップロード機能作成で、アップロードしたファイルの元ファイル名を取得したいっ。
こんな感じで取得できました。

File::Basename::basenameでファイル名を取得するも、サーバーと環境が違うとディレクトリパスをうまく削ってくれない。
正規表現でフルパスからファイル名を取得
————————————————————————–
use File::Basename;
#鯖とクライアントのディレクトリ区切り文字が同じ場合は、これだけで[ファイル名.拡張子]が取れるはず。
my $filename = File::Basename::basename([アップロードファイルへのハンドラ]);
(#拡張子を削除)→ここは不要
$filename =~ s/\..*$//;
#ファイル名の前にあるディレクトリパスを削除
$filename =~ s/(^.*\/)|(^.*\\)//;
—————————————————————————
事前にアップロードが正しく行われたかチェックを忘れずに。
ディレクトリパス削除では「/(スラッシュ)」か「\(円マーク)」があれば、それ以前の文字をすべて削除。
MACの区切り文字は知らないので、LinuxとWindowsしかうまくいかないかも。
正規表現はもっとスマートな記述があるかもしれないけどカンベンシテクダサイ。

明日もがんばります。

以下実際のソース抜粋*************************
#——————————————————————————
#$typeが登録の場合
#——————————————————————————

}elsif( $type eq ‘regist’ ){

#CGIのオブジェクトを作成します。
#この時点でフォームからのデータはメモリ上に取り込まれます。
#このオブジェクトに対してメソッドを実行することで各種操作が可能になります。
#my $q = CGI->new(); # CGIオブジェクト
#サーバー上のファイル名を作成します。
#$q->param(‘i_imgX’)により<input type=file name=”i_imgX”>タグで渡された値を読み込みます。
#つまりフォームに入力したファイル名になります。
#その値に対してbasenameメソッドによりパス部を除去します。
#その後サーバー上のアップロードするパスを定義し、ここでは「.」なのでCGIが置いてあるカレントディレクトリとしています。
#それらを繋げ$newfileXにサーバー上のファイル名を作成します。

#ファイル1の処理
if ( length($query->param(‘i_img1’)) > 0 ) {
$fname = basename($query->param(‘i_img1’));
$fname =~ s/(^.*\/)|(^.*\\)//;
$newfile = “$upload_dir/$fname”;
# 同じファイル名がないかチェック
if ( -f “$newfile”) {
&error($fname.”と同じファイル名が存在します。” .
“ファイル名を変更して送信してください。\n”);
}
}
#ファイル2の処理
if ( length($query->param(‘i_img2’)) > 0 ) {
$fname2 = basename($query->param(‘i_img2’));
$fname2 =~ s/(^.*\/)|(^.*\\)//;
$newfile2 = “$upload_dir/$fname2”;
# 同じファイル名がないかチェック
if ( -f “$newfile2″) {
&error($fname2.”と同じファイル名が存在します。” .
“ファイル名を変更して送信してください。\n”);
}
}

#ファイルが選択されているかチェック
#アップロード処理1
#uploadメソッドによりアップロードするファイルのファイルハンドルを作成します。
#uploadメソッドの返り値はファイルハンドルになります。
#このファイルハンドルに対して処理をすることでアップロードするファイルを操作することができます。
#ファイルが選択されているかチェック
if ( length( $fname ) > 0 ){
my $fh = $query->upload(‘i_img1’);
#copyメソッドでファイルハンドルをファイルにコピーします。
#ファイルハンドルをファイルに書き出せばアップロードできるのでopen, while, binmode, print, closeでも
#ファイルを書き出すことができます。ここではcopyの一コマンドで済ましています。
#この時点でファイルのアップロードは完了します。
copy ($fh, “$newfile”);
#パーミッションを変更
chmod (0666, “$newfile”);
}
#ファイルが選択されているかチェック
if ( length( $fname2 ) > 0 ){
#アップロード処理2
my $fh2 = $query->upload(‘i_img2’);
copy ($fh2, “$newfile2”);
#パーミッションを変更
chmod (0666, “$newfile2”);
}
fileupend:
#CGIのオブジェクトをundefします。
#アップロードを途中でやめた場合や、エラー処理をする場合に、アップロードされたテンポラリファイルが削除されない場合があるので、
#CGIのオブジェクトを廃棄することで、自動的にテンポラリファイルが削除されます。ファイルハンドル$fhはクローズする必要はありません。
#スクリプトの終了と同時にクローズされます。
undef $query;
正規表現
$fname =~ s/(^.*\/)|(^.*\\)//;

$s =~ s/abc/123/i; 置換 abc→123
^ 先頭から
. 改行を除く任意の 1 文字
* 0 回以上のパターン繰り返し
\ メタ文字クォート
| パターン論理和
→ディレクトリパス削除では「/(スラッシュ)」か「\(円マーク)」があれば、それ以前の文字をすべて削除。