When the form is processed, you can retrieve an IO::Handle compatibile handle for a file upload field like this: $lightweight_fh = $q->upload('field_name'); # undef may be returned if it's not a valid file handle if (defined $lightweight_fh) { # Upgrade the handle to one compatible with IO::Handle: my $io_handle = $lightweight_fh->handle; open (OUTFILE,'>>','/usr/local/web/users/feedback'); while ($bytesread = $io_handle->read($buffer,1024)) { print OUTFILE $buffer; } } In a list context, upload() will return an array of filehandles. This makes it possible to process forms that use the same name for multiple upload fields. #### use CGI qw(:standard); #### $lightweight_fh = upload('field_name'); # undef may be returned if it's not a valid file handle if (defined $lightweight_fh) { # Upgrade the handle to one compatible with IO::Handle: my $io_handle = $lightweight_fh->handle; open (OUTFILE,">>/home/path/to/upload_loc"); while ($bytesread = $io_handle->read($buffer,1024)) { print OUTFILE $buffer; } } #### use IO::Handle; #### Undefined subroutine Fh::handle