#!/usr/bin/perl -Tw use CGI; use CGI::Carp qw/ fatalsToBrowser /; use Fcntl; use File::Basename; use POSIX; use strict; $CGI::POST_MAX = 1048576; # Maximal file upload size $CGI::DISABLE_UPLOADS = 0; my $config = { 'allowed_file_types' => [ 'png', 'gif', 'jpg' ], 'upload_fields' => [ 'image_file' ] }; my $cgi = CGI->new; foreach my $field ( @{ $config->{ 'upload_fields' } } ) { if ( defined $cgi->param( $field ) ) { my $fextension = ( fileparse( $cgi->param($field), '\..*' ) )[2]; if ( grep { lc( $_ ) eq lc( $fextension ) } @{ $config->{ 'allowed_file_types' } } ) { my $fname; { local *FH; do { $fname = tmpnam(); } until sysopen ( FH, $fname, O_RDWR|O_CREAT|O_EXCL, 0666 ); my $buffer; while ( read( $cgi->param( $field ), $buffer, 1024 ) ) { syswrite FH, $buffer, length( $buffer ); } close FH; } # continue on and do stuff with uploaded file - file resides in temporary directory with file name $fname } else { # bad file extension } } }