如何在Perl FastCGI程序中保存上传的二进制文件?

时间:2010-03-24 12:05:16

标签: perl upload fastcgi

我的上传功能如下:

sub Upload_File{
my ($file, $mime, $description) = @_;
my $file_name   = param('filename');

my $data;

$file = UnTaint($file);

    if ($mime =~ /text/) {
            sysopen(VAULT, "$path/$file", O_RDWR | O_EXCL | O_CREAT | O_TEXT) or die "couldn't create $file for R/W: $!\n"; }
    else {
            sysopen(VAULT, "$path/$file", O_RDWR | O_EXCL | O_CREAT | O_BINARY) or die "couldn't create $file for R/W: $!\n";
    }

    my $upfh = \*VAULT;
    flock $upfh, 2;
    seek $upfh, 0, 0;
    select((select($upfh), $| = 1)[0]);
    while( sysread($file_name, $data, 8192) ) {
            syswrite($upfh, $data, 8192) or die "couldn't write $upfh: $!\n";
    }

    close $upfh; }

当我使用readprint使用FastCGI上传脚本时,上传了包含损坏的文件(包括简单文本文件),这是因为perl使用了缓冲I / O.但是当我使用syswritesysread即非缓冲I / O时,我得到了很好的文本文件,但无论如何二进制文件都被破坏了。

1 个答案:

答案 0 :(得分:1)

我看到一些关于$file$file_name的混淆。后者要么被错误地命名,要么被错误地使用。

此外,这听起来像binmode问题。您可能需要在输入文件句柄上调用binmode

作为进一步的提示,您可以将文件打开为sysopen(my $upfh, ...。并且搜索是缓冲的,因此如果您使用syswrite(我不会),那么您可以更好地使用sysseek