#!/usr/bin/perl use strict ; use warnings ; use CGI ; use CGI::Carp qw( fatalsToBrowser ) ; use Fcntl qw( :DEFAULT :flock ) ; my $cgi = new CGI ; print $cgi->header ; my $dir = "/www/test" ; my $count = "/www/test/counter.dat" ; my $file = $cgi->param( 'file' ) ; if ( $file =~ /.(jpe?g|gif)$/i ) { accept_file( $file, $dir, next_file_number( $count ), $1 ) ; } else { print <<"END_OF_MSG" ;

$file

Sorry, but you have either not selected a file to upload or you are trying to upload an invalid picture file. Only the following file extensions are supported: /.jpeg/.gif/.jpg. Please press the 'back' button below to return to the Upload form. END_OF_MSG } sub accept_file { my ( $file, $path, $file_num, $ext ) = @_ ; open FH, ">$path/$file_num.$ext" or die "Can't open $path/$file_num.$ext: $!" ; binmode FH ; while ( <$file> ) { print FH $_; } close FH ; } sub next_file_number { my $counter_file = shift ; sysopen FH, $counter_file, O_RDWR|O_CREAT or die "Can't open $counter_file: $!" ; flock( FH, LOCK_EX ) or die "Can't write-lock $counter_file: $!" ; # Now we have acquired the lock, it's safe for I/O my $num = || 0 ; seek FH, 0, 0 or die "Can't rewind $counter_file: $!" ; truncate FH, 0 or die "Can't truncate $counter_file: $!" ; print FH ++$num, "\n" or die "Can't write $counter_file: $!" ; close FH or die "Can't close $counter_file: $!" ; return $num ; }