.csv ファイルを簡単にアップロードしてサーバーに保存しようとしています。私は HTML や Perl の専門家ではありませんが、クライアントの制約により、これを行う必要があります。
HTMLは次のとおりです。
<form action="/path/to/service" target="_self" method="POST" enctype="multipart/form-data">
File: <input type="file" name="attachment" size="50">
<SUBMIT_RESET Upload File>
</form>
Perl コードは次のようになります。
my $sql = "SELECT NOW()";
my $date = $DB->get_field($sql);
my ($path, $ext) = split(/\./, $in{'attachment'});
my @pathParts = split(/\//, $path);
my $filename = $pathParts[@pathParts - 1] . " - " . $date;
if ($ext eq "csv") {
open (OUTFILE, ">", "$datadir/imports/" . $filename . "." . $ext);
while (read($in{'attachment'}, $buffer, 1024)) {
$file .= $buffer;
}
print OUTPUT $file;
close (OUTFILE);
}
私が間違っていることについて、誰かが私に指示を与えることができますか。正しいパスにあるファイルを取得しますが、常に空です。
さて、ここで扱っているコードベースはひどいもので、strict を使用することはできません。
提案?
EDIT1: $in{'attachment'} がどのように入力されるかを回答するために、フォームの処理方法のコード スニペットを含めました。
if ($ENV{'CONTENT_TYPE'} =~ m#^multipart/form-data#) {
私の $cgi = 新しい CGI; 私の@names = $cgi->param;
foreach $name (@names) {
my @value = $cgi->param($name);
if (scalar(@value) > 1) {
foreach $val (@value) {
$in{$name} .= $val."\0";
}
$in{$name} =~s/\\0$//;
} else {
my $value = $cgi->param($name);
#my $value = join "\0", @value;
$in{$name} = $value;
}
#my $value = $cgi->param($name);
#my $value = join "\0", @value;
#$in{$name} = $value;
}
EDIT2:
池上が提供するソリューションを要約すると...
read ステートメントと print ステートメントのファイル ハンドルが異なることに気付きませんでしOUTFILE
たOUTPUT
。明らかにそれは完全に初歩的なミスであり、そのことをお詫びします!
私を助けようとしたすべての人に幸あれ。