我正在尝试简单地上传一个.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语句的文件句柄是不同的-
OUTFILE
和OUTPUT
。显然这完全是新手犯的错误,对此我深表歉意!向所有帮助我的人致以最良好的祝愿。
最佳答案
你不应该使用全局变量。如果您的文件句柄是词法变量(自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/