2010-07-07 78 views
0

我试图用这个非常简单的脚本上传文件到我的服务器。由于某种原因,它不起作用。我在Apache的错误日志中得到以下信息:perl文件上传不能初始化文件句柄


Use of uninitialized value in <HANDLE> at /opt/www/demo1/upload/image_upload_2.pl line 15. 
readline() on unopened filehandle at /opt/www/demo1/upload/image_upload_2.pl line 15. 

#!/usr/bin/perl -w 

use CGI; 

$upload_dir = "/opt/www/demo1/upload/data"; 
$query = new CGI; 
$filename = $query->param("photo"); 
$filename =~ s/.*[\/\\](.*)/$1/; 
$upload_filehandle = $query->upload("photo"); 

open UPLOADFILE, ">$upload_dir/$filename"; 
binmode UPLOADFILE; 

while (<$upload_filehandle>) 
{ 
    print UPLOADFILE; 
} 

close UPLOADFILE; 

1 

任何想法是错误的呢? 谢谢 mx

+0

该文件是否真的存在?您的脚本是否具有访问它的正确权限? – mcandre 2010-07-07 16:28:39

+0

什么权限是neccesary?它有777 - 如果我打印出它正在工作的东西。我想要编写的文件也是777,但它崩溃了,它不会从CGI对象获取句柄。 在调用脚本的窗体中,我有以下输入字段: 这是正确的,不是它? – marcusx 2010-07-07 16:36:23

+0

“form”标记的'enctype'是什么? – 2010-07-07 16:40:55

回答

5

文件上传表格需要指定enctype="multipart/form-data"。见W3C documentation

此外,注意以下几点:

#!/usr/bin/perl 

use strict; use warnings; 
use CGI; 

my $upload_dir = "/opt/www/demo1/upload/data"; 
my $query = CGI->new; # avoid indirect object notation 

my $filename = $query->param("photo"); 
$filename =~ s/.*[\/\\](.*)/$1/; # this validation looks suspect 

my $target = "$upload_dir/$filename"; 

# since you are reading binary data, use read to 
# read chunks of a specific size 

my $upload_filehandle = $query->upload("photo"); 
if (defined $upload_filehandle) { 
    my $io_handle = $upload_filehandle->handle; 
    # use lexical filehandles, 3-arg form of open 
    # check for errors after open 
    open my $uploadfile, '>', $target 
     or die "Cannot open '$target': $!"; 
    binmode $uploadfile; 

    my $buffer;   
    while (my $bytesread = $io_handle->read($buffer,1024)) { 
     print $uploadfile $buffer 
      or die "Error writing to '$target': $!"; 
    } 
    close $uploadfile 
     or die "Error closing '$target': $!"; 
} 

CGI documentation

+0

文件上传表单需要指定enctype =“multipart/form-data”。 这就是诀窍!谢谢!! (还有其他提示) – marcusx 2010-07-09 14:29:42

0

如果您上传文本文件,然后下面应该在HTML文件的<head>设置:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

否则$file_name = $query->param("file_name")在标量上下文(print $file_name)和联合国民主基金在文件上下文定义(<$file_name>) 。