2012-07-17 61 views
0

我想上传一个文件在Perl中,该文件正在创建时,我检查它在FTP服务器上,但大小为0那里,我想知道为什么会发生,我搜索并尝试很多,但无法解决这个问题,你能帮我吗?在perl文件上传中的错误

下面是我使用的代码:

 
    enter code here 
    use CGI; 
    my $query = new CGI; 
    my $upload_dir = "/home/public_html/upload/avatars"; 
    my $filename = $ses->getUserId."_".$query->param("profile_avatar"); 
    my $org_filename = $ses->getUserId."_".$f->{profile_avatar}; 
    my ($name, $path, $extension) = fileparse ($org_filename , qr/\.[^\.]+$/); 
    $filename = $name . $extension; 
    my $safe_filename_characters = "a-zA-Z0-9_.-"; 
    $filename =~ tr/ /_/; 
    $filename =~ s/[^$safe_filename_characters]//g; 
    $filename =~ s/.*[\/\\](.*)/$1/; 
    my $upload_filehandle = $query->upload("profile_avatar"); 
    open(UPLOADFILE, ">$upload_dir/$filename") or $ses->message("$!"); 
    binmode UPLOADFILE; 
    while (<$upload_filehandle>) 
    { 
     print UPLOADFILE; 
    } 
    close UPLOADFILE; 

在这个变量($ upload_filehandle)我得到的空白没什么意思,我不知道为什么会发生。任何帮助,将不胜感激。

回答

0

这里有一个子程序,我知道作品...

我有像您这样的CGI与参数调用它,$查询 - >参数(“profile_avatar”);

sub upload_bin_file 
{ 
my ($ufile) = @_; 
my $ufilename = "\L$ufile"; #Force filename to be lower case 
$ufilename = ~s/\\/\//g;  # Convert backslashes to forward slashes 

my @dirs = split(/\//, $ufilename); # SPlit the filename by the paths(s) 
my $dfile = "$UFILE_DIR/$dirs[$#dirs]"; # This takes just the filename part 
print "File uploaded to [$dfile]<BR>\n"; # Optional debug statement 

open(DEST,">$dfile") or die "[F] Upload server: Could not open $dfile: $!"; 
binmode(DEST); 
binmode($ufile); 
my @src_content=<$ufile>; 
print DEST @src_content; 
close($ufile); 
close(DEST); 

$dfile; #Return the name of the file that we uploaded 
} 

我不确定传入文件的binmode是答案,还是从文件名剥离路径。你可以尝试一下,看看:)

0

我有同样的问题,并浪费了很多时间试图弄清楚。在我看来,解决方案很简单,但并不明显。如果有人发现它有帮助,我会记下它。

原来CGI.pm(3.5.2)在/ usr/tmp目录/

至于原因,我真的不知道的创建临时文件,我的机器就这些> 480围坐;其中一些相当大。原则上这些应该在退出时被删除,但显然还在。当我删除它们时,事情就像之前刚刚开始与原始脚本一起工作。

不幸的是,我用'rm/usr/tmp/CGI *'清理了tmp/up,没有真正环顾四周。 tmp /可能已经完全填满了,而我恰好释放了一些空间。但是perl(v5.14.2)获得了它认为完美的文件句柄。没有人注意到或以其他方式投诉(这是服务器,所以你会认为他们应该有)。对于

有用的代码一路上:

print "Content-type: text/html\012\012"; 
print "<html><head></head><body>\012"; 
print "<b>Below is an EXACT echo of what your browser sent:</b>\012<hr>"; 
print "<pre>\012"; 
while (<STDIN>) { 
    s/>/&gt;/g; 
    s/</&lt;/g; 
    print $_; 
} 

print "</pre>\012"; 
print "</body></html>\012";