いつもお世話になります。
ファイルアップロードし、アップロードしたファイル名を記録するプログラムを
作成しております。(ファイル名を記録し、別プログラムでファイル名にリンクを張ります。)
この中でアップロードファイル名がc:\temp\cgi\test.cgiやc:\mydocument\test\temp\cgi\test.cgiと
いったものも含め実ファイル名(test.cgi)のみを抜きだして記録したいのですが、上手くいきません。
ファイル名を切り出す方法を教えていただきましたが、こちらも上手くいきませんでした。
$inLink =~ s/^.*[\\\/]//;と記述。
どなたかご教示お願いいたします。
No.8ベストアンサー
- 回答日時:
#7>$inLINK =~ s/^.*\\//;を解説していただければ助かります。
#1の方が書いていらっしゃるように、ファイル名以外の部分を取り除きます。
変数 =~ s/パターン/置き換える文字列/;
は、変数でパターンにマッチングした部分を"置き換える文字列"で置き換えます。
^ は、先頭を表すパターンで
.* は、一文字の0回以上の繰り返しパターン
\\ は、円マーク\ ですが、\ 自体が次のパターン文字をパターンとして認識させないという機能を持つ記号なので、\\のように2つ続けて書く必要があります。
つまり、先頭から、\までを"何もない"と置き換える、即ち取り除くという意味になります。
この場合、.* は、より長くマッチしようとするので、フォルダの階層が深くて \ マークが複数在った場合でも最後の \ マークまで取り除くことができます。
BLUEPIXY様おはようございます。無理なお願いに対応していただきありがとうございました。おかげさまで理解が進みました。BLUEPIXY様含め今回の件は皆さんに感謝いたします。本当にありがとうございました。
No.7
- 回答日時:
#5補>
>$inLink =~ /(^.*\\)(.*)/;
>open(OUT, "> ../upload/$inLINK");
は、ダメです。
>$inLink =~ /(^.*\\)(.*)/;
の部分では、s/…/…/をしていませんから、マッチングをさせているだけですから$inLink は置き換えられていません。
マッチングが成功した場合には
open(OUT, "> ../upload/$2");
のようにすればいいと思います。
また、$inLink を置き換えた場合には
>open(OUT, "> ../upload/$inLINK");
の$inLINK は、"LINK" が大文字になっているため別の変数になっています。同じ変数名を使う必要があります。
この回答への補足
BLUEPIXY様:回答が遅れて申し訳ありません。変数名の件お恥ずかしながらミスでした。ご指摘ありがとうございます。冷静な目が必要ですね
。結局下記のようにして動作いたしました。沢山の方々にサポートしていただき助かりました。不勉強で申し訳ありませんが、~ /(^.*\\)*)/;を解説していただければ助かります。
if ($inLINK ne '')
{
while ($bytesread = read($inLINK, $buffer, $BUFSZ))
{
$file .= $buffer;
}
$inLINK =~ s/^.*\\//;
open(OUT, "> ../upload/$inLINK");
binmode(OUT);
print(OUT $file);
close(OUT);
}
No.6
- 回答日時:
use strict;
を使われることをおすすめします。
Perlでは大文字と小文字を区別しますから。
basenameが使えないのもこれで解消できればいいのですが、、、
私が知ってる各OSのデリミタは
UNIX(UNIX like OS) /
Windows(DOS) \ (ドライブとパスの区切りに:を使用)
Mac Classic :
MacOS X /
です。
私はデリミタで分割して最後の部分を取り出してましたけどね(^^;
Perlの場合は、
if(($pos=rindex($inLink,'/'))>=0){
$inLink = substr($inLink, $pos+1);
}elsif(($pos=rindex($inLink,'\\'))>=0){
$inLink = substr($inLink, $pos+1);
}elsif(($pos=rindex($inLink,':'))>=0){
$inLink = substr($inLink, $pos+1);
}
print $inLink;
こんな感じで出来たと思いますが、正規表現で不要部分を消しちゃった方がスマートかも(^^;
ファイル名の取得方法はどのようにされてますか?
<form action="" method="post" enctype="multipart/form-data">
で送信されている場合は、
filename=~
という行が書き出されますが、このときのファイル名は、
ブラウザがデリミタを変更する場合もあるので、クライアントのOSに関係なく、すべてをチェックした方が良いと思います。
この回答への補足
taloo様ご回答ありがとうございます。
とりあえずuse strict;を使用してみます。
それから下記部分のご解説をお願いします。
form action="" ~はご指摘の通り記述しております。
「filename=~で書き出される」、「クライアントのOSに関係なく~」の箇所が不勉強で理解できませんでした。
--------------------------------------------------
<form action="" method="post" enctype="multipart/form-data">
で送信されている場合は、
filename=~
という行が書き出されますが、このときのファイル名は、
ブラウザがデリミタを変更する場合もあるので、クライアントのOSに関係なく、すべてをチェックした方が良いと思います。
No.5
- 回答日時:
#3>basenameが上手く動作していないみたい
う~ん、なんでですかね~。
#3がうまくいかないのは、OS間でファイルパスの記述が異なるからかもしれませんけど、
#1,2,4でうまくいかない理由がわからないですね。
本当に、切り出そうとしている $inLink にc:\mydocument\test\temp\cgi\test.cgi のような文字列が入っているんでしょうか?
この回答への補足
BLUEPIXY様おはようございます。何度もテストしました。例えばC:\TEMP\CGI\test\upload4\readme.txtファイルを切り出そうと思い下記記述をしてみましたが、上手くいっておりません。ファイルは「C:\TEMP\CGI\test\upload4\readme.txt」でアップロードされファイル名は記録されていません。
$BUFSZ = 2048;
$file = '';
$buffer = '';
if ($inLINK ne '')
{
while ($bytesread = read($inLINK, $buffer, $BUFSZ))
{
$file .= $buffer;
}
$inLink =~ /(^.*\\)(.*)/;
open(OUT, "> ../upload/$inLINK");
binmode(OUT);
print(OUT $file);
close(OUT);
}
---------------------------------------
ファイル記述は下記の通りです。
seek(DATA, 0, 0);
print DATA $tNum."\n";
print DATA @tData;
print DATA $tNum."<>".$inTITLE."<>".$inMAIN."<>".$inDATE."<>".$inSEL."<>".$inLink."<>".$inFLAG."<>".$inCATE."\n";
truncate(DATA, tell(DATA));
close(DATA);
&unlock;
私では手に負えません。ヒントなどなんでも結構ですので教えて下さい。
No.4
- 回答日時:
use strict;
my $up_file = 'c:\mydocument\test\temp\cgi\test.cgi'; # としたとき、
my $up_file_name = ( split /[\/\\]/, $up_file )[-1];
print "$up_file_name\n";
No.3
- 回答日時:
use File::Spec;
$file=q(c:\temp\test.txt);
($volume, $directories, $filename)=File::Spec->splitpath($file);
print "$filename\n";
か
use File::Basename;
$filename = basename($file);
print "$filename\n";
この回答への補足
BLUEPIXY様ご回答ありがとうございます。テストしてみましたが、ファイル名が入りませんでした。どうやらbasenameが上手く動作していないみたいです。環境の設定などございますでしょうか?
プログラムの先頭付近にuse File::Basename;を記述し、
ファイル名を書き込み所で$filename = basename($file);を記述しております。
No.1
- 回答日時:
こんなんですかねぇ。
$inLink =~ s/^.*\\//;
でもこれだと切り出すというよりは余計な部分を削除してるだけですが。
この回答への補足
ttyp03様ご回答ありがとうございます。テストしていた為回答が遅くなりました。色々やってみたのですが、ファイル名が変わりませんでした。c:\mydocument\test\temp\cgi\test.cgi等をアップロードするとそのまま(c:\mydocument\test\temp\cgi\test.cgiという風に)記録されてしまいます。クライアントは(windows多数、MACも多少あり。)サーバーはlinuxです。引き続きサポート願えれば幸いです。
補足日時:2006/04/27 18:05お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- その他(IT・Webサービス) WPからダウンロードしたファイル名を指定したい 2 2022/04/08 08:31
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Windows 10 renameコマンドでファイル名からアンダースコアを消す方法 5 2023/04/24 13:33
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
- HTML・CSS HTMLを正しく表示させるには 2 2023/06/18 09:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<form method="post" action="...
-
CGI.pmとcgi-lib.plの差異につ...
-
c言語とperlのcgi設定方法
-
DBを10件毎に表示ページング...
-
6月の第2 第4火曜日は何日...
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
週2回のペースって だいたい何...
-
エクセルで毎月第2週日の水曜日...
-
Perl の外部モジュールの利用方法
-
[Excel] ある日の曜日が当月の"...
-
リストコントロールの列幅を固...
-
ディレクトリパスの取得について
-
[C#]ListView一覧表示時の幅設...
-
バイナリファイルのアップロード
-
AccessVBAで「このフィールドに...
-
Consolidateメソッドの引数のSo...
-
曜日と曜の使い分けがわかりま...
-
毎○曜日って、使いますか?
-
クライアントのIPとマシン名を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBでcgiを動作させるには
-
cgiで拡張子.cgiと拡張子.pl...
-
PerlのCGIでフォームのテキスト...
-
<form method="post" action="...
-
CGI.pmとcgi-lib.plの差異につ...
-
ファイル名の抜き出しについて
-
cgiから別のcgiへの変数...
-
知恵熱出そうです・・・;
-
アップロードされてきた画像フ...
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
エクセルで毎月第2週日の水曜日...
-
6月の第2 第4火曜日は何日...
-
DBを10件毎に表示ページング...
-
毎○曜日って、使いますか?
-
エクセルで相対パスの書き方を...
-
週2回のペースって だいたい何...
-
apacheでPerl CGIが作動せず、5...
-
燃えるゴミの日は何曜日ですか?
-
[Excel] ある日の曜日が当月の"...
おすすめ情報