Как сохранить загруженные двоичные файлы в программе Perl FastCGI? - PullRequest
1 голос
/ 24 марта 2010

Моя функция загрузки выглядит так:

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; }

Когда я использую read и print со скриптом загрузки FastCGI, файлы, загруженные с повреждениями (включая простые текстовые файлы), это потому, что perl использует буферизованный ввод / вывод. Но когда я использую syswrite и sysread , то есть небуферизованный ввод / вывод, в результате я получаю хорошие текстовые файлы, но двоичные файлы все равно повреждены.

1 Ответ

1 голос
/ 24 марта 2010

Я вижу некоторую путаницу в отношении $file и $file_name. Последний либо неправильно назван, либо неправильно использован.

Далее, это звучит как проблема binmode . Возможно, вы захотите позвонить binmode в свой дескриптор входного файла.

В качестве дополнительной подсказки вы можете открыть свои файлы как sysopen(my $upfh, .... И поиск в буфере, так что если вы используете syswrite (я бы не стал), тогда вы можете лучше использовать sysseek .

...