#!/usr/bin/perl # # A quick way to use Apache+CGI with a few common # options (Execs in ~user/public_html/cgi-bin, # PUT enabled) to do file upload for all the world. # Makes webpage to ask for choice of file, then # uploads, saves to a cleaned-up name, and gives # a confirmation page to the uploader and an email # to the script-owner. # # Nathaniel, 2009-03-18. # use CGI; use CGI ':standard'; use CGI ':cgi-lib'; use CGI ':pretty'; # allow uploaded files to be publicly readable ? $public = 0; # title for webpage $title = 'File Upload (to Nathaniel)'; # place to which to make uploads $ul_root = '/home/nt/public_html/tmp/upload'; # language and character coding $lang = 'en-GB'; $enc = 'utf-8'; # check the root of the upload area exists -d $ul_root || die "upload-root \"$ul_root\": $!"; # header for webserver--client print header ( '-type'=>'text/html', '-content-language'=>$lang, '-charset'=>$enc, '-content-transfer-encoding'=>$enc ); print start_html( '-title'=>$title, '-encoding'=>$enc, '-lang'=>$lang, '-style'=>{-src=>'../scripts/nsty1.css'} ); print h1($title); if ( ! param('ulfile') ) { print p(), "\n", start_multipart_form(), "File for upload: ", filefield(-name=>'ulfile', -size=>45), br(), br(), submit(-name=>'',-value=>'Start upload'), br(), end_form(); } else { print p("Uploading \"" . param('ulfile') . "\"
\n"); unless ($frem = param('ulfile')) { die "failed to read remote file"; } $_ = $frem; s/.*\///; if (m/(.+)\.([^.]*)$/) { $fnew_b = $1; $fnew_e = $2; $fnew_b =~ s/[^[:alnum:]]/_/g; $fnew_b =~ s/___+/__/g; $fnew_e =~ s/[^[:alnum:]]/_/g; $fnew_e =~ s/___+/__/g; $_ = $fnew_b . '.' . $fnew_e; } else { s/[^[:alnum:]]/_/g; s/___+/__/g; } $fnew = "\L$_"; $fout = $ul_root . '/' . $fnew; open(FOUT, ">$fout") || die "opening output file: $!"; print "\n"; $chunk = 1024*128; $stot = 0; while ($slast = read($frem,$tmpread,$chunk)) { $stot += $slast; print FOUT $tmpread; } print "\n"; close FOUT; print p("Finished: $stot bytes read.\n"); print br(); print p('Do another upload.' . "\n"); if ($public) { chmod(0644, $fout); } else { chmod(0600, $fout); } open MAIL, "| mail -s \"`hostname`: an upload for `whoami`\" `whoami`" || die "opening pipe to 'mail': $!\n"; $date = `date`; print MAIL "Finished: ${date}Filename: \"$frem\"\n"; print MAIL "Saved as: \"$fout\"\nSize: $stot bytes.\n\n"; for ( qw( REMOTE_HOST REMOTE_ADDR HTTP_USER_AGENT SCRIPT_NAME ) ) { printf MAIL "%s = %s\n", $_, $ENV{$_}; } close MAIL; } print br(); print p('See the upload directory list.' . "\n"); print end_html;