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.