- 締切済み
ファイルをアップロードするCGI
ファイルをアップロードしたいCGIが欲しく サンプルをみつけたのですが、このCGIだと ファイルをアップロードしたときに、ファイル名がアップロードした時刻になってしまいます。 ファイル名を変更することなく、アップロードするにはどう変更すればよいのでしょうか? お願いします。ちなみにアップロードしたいファイルの種類はエクセル形式のファイルです。 プログラムは以下のようになってます。 #!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- YkazubonY
- ベストアンサー率30% (26/86)
下記の様に、myを前に付ける事。 my $uploadname = $fh; my @pathary = split(/\\/, $uploadname); my $lastpos = @pathary; それと、こっちの方が正解かもな。 やってみんと分からんが。 my @pathary = split(/\//, $uploadname);
- YkazubonY
- ベストアンサー率30% (26/86)
(旧) my $outputfn = "$outputdir/$timestamp$ex"; (新) $uploadname = $fh; chomp($uploadname); @pathary = split(/\\/, $uploadname); $lastpos = @pathary; $uploadname = $pathary[$lastpos-1]; my $outputfn = "$outputdir/$uploadname"; コピペばかりしてると池沼になるぞ。www
お礼
ありがとうございます。 上記のように書き換えると Software error とでて Global symbol "$uploadname" requires explicit package name at C:\・・・・ のようなエラーが変更した箇所にでます 何が原因でしょうか?
お礼
できました。ありがとうございます。 しかし日本語のファイル名をアップロードすると ファイル名が文字化けそしてファイル自体が壊れてしまいます もうこれはしかたないことなんでしょうか