0

我正在尝试在 perl 中上传文件,当我在 ftp 服务器上检查它时正在创建文件,但那里的大小为 0,我想知道为什么会这样,我搜索并尝试了很多但无法解决这个问题,请你帮助我好吗?

这是我正在使用的代码:

    在此处输入代码
    使用 CGI;
    我的 $query = 新 CGI;
    我的 $upload_dir = "/home/public_html/upload/avatars";
    我的 $filename = $ses->getUserId."_".$query->param("profile_avatar");
    我的 $org_filename = $ses->getUserId."_".$f->{profile_avatar};
    我的 ($name, $path, $extension) = 文件解析 ($org_filename, qr/\.[^\.]+$/ );
    $文件名 = $name 。$扩展;
    我的 $safe_filename_characters = "a-zA-Z0-9_.-";  
    $文件名 =~ tr/ /_/;
    $filename =~ s/[^$safe_filename_characters]//g;
    $filename =~ s/.*[\/\\](.*)/$1/;
    我的 $upload_filehandle = $query->upload("profile_avatar");
    open(UPLOADFILE, ">$upload_dir/$filename") 或 $ses->message("$!");
    binmode 上传文件;
    而 (<$upload_filehandle>)
    {
        打印上传文件;
    }
    关闭上传文件;

在这个变量($upload_filehandle)中,我得到了空白,没有任何意义,我不知道为什么会这样。任何帮助,将不胜感激。

4

2 回答 2

0

这是一个我知道有效的子程序......

我有一个像你这样的 CGI,它使用参数 $query->param("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 是答案,还是从文件名中删除路径。你可以试试看:)

于 2012-10-03T09:06:30.350 回答
0

我遇到了同样的问题,浪费了很多时间试图弄清楚。就我而言,解决方案很简单,但一点也不明显。我正在记下它,以防人们发现它有帮助。

事实证明 CGI.pm (3.5.2) 在 /usr/tmp/ 中创建临时文件

由于我不确定的原因,我的机器有超过 480 个这样的机器。其中一些相当大。原则上,这些应该在退出时被删除,但显然仍然存在。当我删除它们时,就像以前一样,原始脚本又开始工作了。

不幸的是,我使用 'rm /usr/tmp/CGI*' 清理了 tmp/ 并没有真正环顾四周。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";
于 2014-01-30T01:39:46.853 回答