我正在尝试简单地上传一个.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);
    }

有人能告诉我我做错了什么吗。我得到的文件位于正确的路径,但它总是空的。
现在,我在这里处理的代码库是可怕的,我不能使用严格的。
建议?
编辑1:
为了回答{'attachment'}中的$是如何填充的,我提供了一段处理表单的代码片段。
如果($ENV{'CONTENT{u TYPE}=~m#^multipart/form data#){
我的$cgi=新的cgi;
my@names=$cgi->参数;
        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;
        }

编辑2:
总结一下ikegami提供的解决方案。。。
我没有注意到read和print语句的文件句柄是不同的-OUTFILEOUTPUT。显然这完全是新手犯的错误,对此我深表歉意!
向所有帮助我的人致以最良好的祝愿。

最佳答案

你不应该使用全局变量。如果您的文件句柄是词法变量(自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

关于html - 使用HTML和Perl上传文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12736652/

10-12 00:37
查看更多