Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: simple CGI::upload_hook() guide or example?

by cees (Curate)
on Oct 12, 2005 at 17:52 UTC ( [id://499616]=note: print w/replies, xml ) Need Help??


in reply to simple CGI::upload_hook() guide or example?

OK, here is a completely stripped down version that just writes some data to a log file. This works fine on my machine

#!/usr/bin/perl use strict; use warnings; use File::Slurp; use CGI qw(:standard); my $query = CGI->new(\&_hook, 'ID'); # Grab the uploaded file my $file = $query->param('uploaded_file'); print header, start_html(-title => 'A Simple Upload Meter Example'), h +1('Upload Complete'), end_html; # This is the upload_hook that gets called repeatedly by CGI.pm # during an upload. It gets called once for every 4K of data read in # by CGI.pm sub _hook { my ($filename, $buffer, $bytes_read, $umid) = @_; write_file( '/tmp/filename', {append => 1 }, "Uploading $filename +($umid) - $bytes_read\n" ) ; sleep 1; }

And here is a simple HTML page that you can use to call it:

<html> <body> <form method="post" action="example.cgi" enctype="multipart/fo +rm-data"> upload file: <input type="file" name="uploaded_file" /><br />< +input type="submit" tabindex="2" name=".submit" /> </body> </html>

My gut instinct tells me that your test DID work, but your logfile was just buffering the output. To guarantee that it doesn't happen with this example, I am doing something very inefficient by opening and closing the log file on every call to the hook.

Also, I should note that the CGI.pm docs are not very clear in how to use the upload hook. CGI.pm needs to know about the hook when it is first used, so you have to call CGI::upload_hook(\&hook,$data); before you do anything else. And if you use the OO interface like I do, you must pass the hook in at creation time.

Replies are listed 'Best First'.
Re^2: simple CGI::upload_hook() guide or example?
by thoughts (Initiate) on Oct 12, 2005 at 21:03 UTC
    My gut instinct tells me that your test DID work, but your logfile was just buffering the output.

    This does appear to be the case. Even though I tried both of these in my hook:

    select(STDERR); $|=1; print STDERR "$byte_size\n";
    select((select(STDERR), $| = 1)[0]); print STDERR "$byte_size\n";

    ...STDERR refused to be unbuffered. Switching to a custom (plain old) logfile allowed it to work.

    To guarantee that it doesn't happen with this example, I am doing something very inefficient by opening and closing the log file on every call to the hook.

    But since the purpose of this is for some secondary process to be reading the log at the same time as it's being written, you'd at least have to release the filelock after every hook call, right?

    And if you use the OO interface like I do, you must pass the hook in at creation time.

    Good to know; I can't imagine how one is supposed to determine that (how did you?), given that the docs certainly don't say anything about it.

    Thanks for your help.

      ...STDERR refused to be unbuffered

      Well, you might be unbuffering your perl code, but Apache could still be buffering the output before it writes it to the error log...

      I can't imagine how one is supposed to determine that (how did you?), given that the docs certainly don't say anything about it.

      If I can't get something to work according to the docs, then I assume the docs are lying and check the source. Mind you the source of CGI.pm is not for the faint of heart ;). I meant to send in a doc patch to clarify this stuff, but never got around to it. If you can find the time, I am sure Lincoln would appreciate it.

      The upload hook seems to be one of those cool things that no one really uses. I guess that is why there is such a lack of info on the subject...

        The upload hook seems to be one of those cool things that no one really uses. I guess that is why there is such a lack of info on the subject...
        Yeah, it seems unusually unknown/unused. With all the hype surrounding AJAX and Ruby on Rails, I've come across this implementation a couple times, and it seems like a fancy newfangled thing... but I see it's been possible for quite some time in Perl.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://499616]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2024-11-12 10:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    chatterbot is...






    Results (39 votes). Check out past polls.