2012-10-04 38 views
2

我正在嘗試簡單地上載.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:

總結池上所提供的解決方案......

我錯過了的文件句柄是用於讀取和打印語句不同 - OUTFILEOUTPUT。很明顯,這完全是一個新手的錯誤,爲此我表示歉意!

對所有試圖幫助我的人表示最良好的祝願。

+1

'$ in {'attachment'}'是如何填充的? – ikegami

+0

我假設$ {'attachment'}中的$是讀取附件的文件句柄。嘗試之前任何讀取。 binmode $ in {'attachment'}; –

+0

@Robert Hanson,它也可以是Rico。 – ikegami

回答

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)。

+0

完全錯過了分配的文件句柄。謝謝! – Rico

+0

添加到我的答案。 – ikegami

0

HTML代碼

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>File Upload</title> 
</head> 
<body> 
    <form action="upload.cgi" method="post" enctype="multipart/form-data"> 
     <p>Photo to Upload: <input type="file" name="photo" /></p> 
     <p><input type="submit" name="Submit" value="Submit Form" /></p> 
    </form> 
</body> 
</html> 

Perl代碼文件名upload.cgi下:

#!C:\Program Files\perl\bin\perl.exe 

use strict; 
use CGI; 
use CGI::Carp qw (fatalsToBrowser); 
use File::Basename; 
$CGI::POST_MAX = 1024 * 5000; 
my $safe_filename_characters = "a-zA-Z0-9_.-"; 
my $upload_dir = "fileUpload/"; 
my $query = new CGI; my $filename = $query->param("photo"); 
if (!$filename) 
{ 
    print $query->header (); 
    print "There was a problem uploading your photo (try a smaller file)."; 
    exit; 
} 
my ($name, $path, $extension) = fileparse ($filename, '..*'); 
$filename = $name . $extension; 
$filename =~ tr/ /_/; $filename =~ s/[^$safe_filename_characters]//g; 
if ($filename =~ /^([$safe_filename_characters]+)$/) 
{ 
    $filename = $1; 
} else { 
    die "Filename contains invalid characters"; 
} 
my $upload_filehandle = $query->upload("photo"); 
open (UPLOADFILE, ">$upload_dir/$filename") or die "$!"; 
binmode UPLOADFILE; 
while (<$upload_filehandle>) 
{ 
    print UPLOADFILE; 
} 
close UPLOADFILE; 
print $query->header (); 
print <<END_HTML; 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Thanks!</title> 
<style type="text/css"> 
img {border: none;} 
</style> 
</head> 
<body> 
<p>Thanks for uploading your photo!</p> 
</body> 
</html> 
END_HTML 

我沒有寫這個代碼,但它確實幫助我很多。我希望它也能幫助你。使這段代碼適合我的原因是獲得了perl.exe的路徑。