2

.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 ステートメントのファイル ハンドルが異なることに気付きませんでしOUTFILEOUTPUT。明らかにそれは完全に初歩的なミスであり、そのことをお詫びします!

私を助けようとしたすべての人に幸あれ。

4

2 に答える 2

3

グローバル変数を使用するべきではありません。ファイルハンドルが字句変数(2000年以降サポートされています!)であり、使用していた場合use strict;(2000年以降もサポートされていますが、それ以前ではない場合)、問題が見つかります。

print呼び出しで適切な変数を使用していません。

open (OUTFILE, ">", "$datadir/imports/" . $filename . "." . $ext);
print OUTPUT $file;

問題を発見したとき、実際にどのようなエラーが発生したかを調べることをお勧めしました。

open(my $OUTFILE, ">", "$datadir/imports/$filename.$ext")
   or die $!;

while (1) {
   my $rv = read($in{'attachment'}, my $buf, 1024);
   die $! if !defined($rv);
   last if !$rv;

   print $OUTFILE $buf
      or die $!;
}

close($OUTFILE)
   or die $!;

Bad file descriptor(ファイルハンドルではないものをに渡したために、エラーが「」であると仮定しましたread。)

于 2012-10-04T23:24:36.210 に答える