Моя функция загрузки выглядит так:
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 , то есть небуферизованный ввод / вывод, в результате я получаю хорошие текстовые файлы, но двоичные файлы все равно повреждены.