我正在嘗試簡單地上載.csv文件並將其保存在我的服務器上。我不是HTML或Perl方面的專家,但由於客戶的限制,這是我必須做的。使用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);
}
任何人都可以請給我一些指導,以什麼我做錯了。我得到的文件位於正確的路徑,但它總是空的。
現在,我在這裏處理的代碼基礎是可怕的,我不能嚴格使用。
對此提出建議?
EDIT1: 要試圖回答{'attachment'}中的$是如何填充的,我已經包含了如何處理表單的一段代碼。
if($ ENV {'CONTENT_TYPE'} =〜m#^ multipart/form-data#){
my $ cgi = new CGI; my @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:
總結池上所提供的解決方案......
我錯過了的文件句柄是用於讀取和打印語句不同 - OUTFILE
和OUTPUT
。很明顯,這完全是一個新手的錯誤,爲此我表示歉意!
對所有試圖幫助我的人表示最良好的祝願。
'$ in {'attachment'}'是如何填充的? – ikegami
我假設$ {'attachment'}中的$是讀取附件的文件句柄。嘗試之前任何讀取。 binmode $ in {'attachment'}; –
@Robert Hanson,它也可以是Rico。 – ikegami