An deinem Code kann ich sehen, dass du aus einer schlechten/veralteten Quelle lernst. Ersetze sie durch etwas modernes, damit du guten Code schreibst.
In https://forum.selfhtml.org/?t=212104&m=1448606 habe ich dir schon das besseres Modul File::LibMagic zur Inhaltserkennung empfohlen, benutze es.
Du brauchst nicht manuell umpuffern, um eine Datei zu kopieren. Benutze File::Copy, es kann mit Handles umgehen.
#!/usr/bin/env perl
use CGI qw();
use Fcntl qw(SEEK_SET);
use File::Copy qw(cp);
use File::LibMagic qw();
use autodie qw(cp);
my $cgi = CGI->new;
my $handle = $cgi->upload('incoming')->handle;
$handle->read(my $buffer, 4*1024);
$cgi->print(
$cgi->header('text/plain'),
sprintf
"Client type: %s\nServer detected type: %s\n",
$cgi->uploadInfo($cgi->param('incoming'))->{'Content-Type'},
File::LibMagic->new->checktype_contents($buffer)
);
seek($handle, 0, SEEK_SET);
cp $handle, '/tmp/foobar';