use CGI: my $q = new CGI; use constant BUFFER_SIZE => 16_384; my $filename = $q->param( "filename" ) || die; # Assuming $filename is sanitized... my $fh = $q->upload( "file" ); my $buffer = ''; open(OUT,">/tmp/$filename"); binmode $fh; binmode OUTPUT; # Write contents to output file while ( read( $fh, $buffer, BUFFER_SIZE ) ) { print OUTPUT $buffer; }