Моя функция загрузки выглядит следующим образом:Как сохранить загруженные двоичные файлы в программе Perl 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; }
Когда я использую read и print с помощью сценария загрузки FastCGI, файлы, загруженные с искаженной (в том числе простые текстовые файлы), это происходит потому, что perl
использует буферизованный ввод/вывод. Но когда я использую syswrite и sysread т. Е. Небуферизованный ввод-вывод, в результате получаю хорошие текстовые файлы, но двоичные файлы все равно повреждены.
Не могли бы вы рассказать, какие библиотеки вы используете? И используете ли вы строгие предупреждения и предупреждения? –
использование CGI :: Быстрый qw (: стандартный); использовать строгое; использование кодировки 'utf8'; использование FCGI :: ProcManager; use File :: Basename; DBD :: SQLite; использовать Fcntl; использовать POSIX; и да, я использую предупреждения. – user199509
Проблема заключалась в использовании кодировки 'utf8'. После того, как я удалю его, все файлы загружаются без коррупции. – user199509