/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
CGI upload og \&hook
Fra : rené


Dato : 19-09-08 10:23

Hej NG,

Jeg har lavet et script til upload af video-filer til mit eget video-arkiv
(med konvertering og integration med database med videre bagved), og det
virker ganske fint (perl CGI).

Nu ville jeg så gerne skiftede min fake upload-bar ud med en der rent
faktisk viser hvor langt min upload er kommet.

I den forbindelse har jeg læst og læst i man-siden til perl CGI samt
googlet en del, og fundet frem til en løsning der anvender en kombination
af CGI::Ajax og \&hook-kaldet under oprettelse af ens CGI-objekt.

Et fungerende eksempel her: http://www.perlmonks.org/?node_id=588964

I korte træk laver ovenstående script først en upload-form med et unikt ID
(jeg har i mit eget script en sub der kreerer et unikt ID i min database),
som anvendes af AJAX-delen til senere at sende requests til
server-scriptet med henblik på at få status på upload.

Jeg er i midlertid rendt ind i et 'hønen og ægget'-problem i forbindelse
med denne løsning;
Det ovenstående script gemmer filerne på serveren med et filnavn der
består af et random ID+originalt filnavn (den fulde sti til filen på pc'en
det blev uploadet fra, f.eks. C:\WINNT\profiles\<username>\hest.txt), men
jeg vil gerne have mulighed for at gemme filen direkte under et filnavn
jeg selv bestemmer, samtidig med, at AJAX-delen skal have adgang til at
efterspørge status på fil-uploaden medens denne foregår.

At gemme direkte med 'mit eget' filnavn kan jeg fint styre gennem det
genererede ID, men hvordan jeg sender dette ID videre til hook-sub'en kan
jeg ikke lige greje.

Jvf. dokumentationen til CGI, så kan man sende $data videre til ens 'hook'
(f.eks. et databaseID), MEN man må ikke foretage et eneste CGI-kald før
'hook' er erklæret (gennem f.eks. $q = CGI->new(\&hook[[, $data[,
$use_tempfile]]), hvilket så vil sige, at jeg ikke ved hvordan jeg sender
mit generede ID videre til hook'et.. Gav dette nogen mening?

Hvis det var muligt at foretage CGI-kald (param('id') før erklæringen af
$q ville det være et genialt værktøj til at lave en uploadstatus med
filnavne der er detainted.

Jeg har i øvrigt prøve at pass'e $data som reference, og så tildele id til
$data efterfølgende, men der kommer ikke noget igennem til hook-sub'en.

Mvh

/rené


 
 
Peter Makholm (19-09-2008)
Kommentar
Fra : Peter Makholm


Dato : 19-09-08 10:27

virker@ikke.nej (rené) writes:

> Jeg har i øvrigt prøve at pass'e $data som reference, og så tildele id
> til $data efterfølgende, men der kommer ikke noget igennem til
> hook-sub'en.

Hvad prøvede du helt præcist og hvordan observerede du at der ikke kom
noget igennem?

(Nej, jeg kender ikke de moduler du spørger om)

//Makholm

rené (19-09-2008)
Kommentar
Fra : rené


Dato : 19-09-08 10:36

Peter Makholm skrev:

> virker@ikke.nej (rené) writes:

>> Jeg har i øvrigt prøve at pass'e $data som reference, og så tildele id
>> til $data efterfølgende, men der kommer ikke noget igennem til
>> hook-sub'en.

> Hvad prøvede du helt præcist og hvordan observerede du at der ikke kom
> noget igennem?

Eksempel 1:
my $data = { id => undef };

my $pjx = new CGI::Ajax('check_status' => \&check_status);
my $q = CGI->new(\&hook,\$data);
$data->{id} = 'test';

...


sub hook {
my ($filename, $buffer, $bytes_read, $data) = @_;

$bytes_read ||= 0;
my $id = $$data;
open(LOG, ">".$Upload_Dir. "/log.log");
print LOG "$bytes_read / ".$id->{id}."\n";
..
}

$id->{id} er tom



Eksempel 2:
my $data = { id => undef };
$data->{id} = 'test';
my $pjx = new CGI::Ajax('check_status' => \&check_status);
my $q = CGI->new(\&hook,\$data);


...


sub hook {
my ($filename, $buffer, $bytes_read, $data) = @_;

$bytes_read ||= 0;
my $id = $$data;
open(LOG, ">".$Upload_Dir. "/log.log");
print LOG "$bytes_read / ".$id->{id}."\n";
..
}

$id->{id} indeholder 'test'


(det samme, hvis jeg overfører som scalar ref)


> (Nej, jeg kender ikke de moduler du spørger om)

> //Makholm

/rené


Peter Makholm (19-09-2008)
Kommentar
Fra : Peter Makholm


Dato : 19-09-08 12:47

virker@ikke.nej (rené) writes:

> Hvis det var muligt at foretage CGI-kald (param('id') før erklæringen
> af $q ville det være et genialt værktøj til at lave en uploadstatus
> med filnavne der er detainted.

Efter at have glanet en smule i selve CGI.pm tror jeg ikke der er
nogen umidelbar let løsning. Hook-funktionen kaldes som en del af
parsningen af CGI-forspørgslen og det skal selvfølgelig gøres inden du
kan slå parametre op.

//Makholm

rené (19-09-2008)
Kommentar
Fra : rené


Dato : 19-09-08 13:48

Peter Makholm skrev:

> virker@ikke.nej (rené) writes:

>> Hvis det var muligt at foretage CGI-kald (param('id') før erklæringen
>> af $q ville det være et genialt værktøj til at lave en uploadstatus
>> med filnavne der er detainted.

> Efter at have glanet en smule i selve CGI.pm tror jeg ikke der er
> nogen umidelbar let løsning. Hook-funktionen kaldes som en del af
> parsningen af CGI-forspørgslen og det skal selvfølgelig gøres inden du
> kan slå parametre op.

Det virker som om ideen ikke var helt gennemtænkt med det der hook-noed..
det ville være genialt hvis man kunne styre hvad der ellers ville blive
sendt (når nu $filename og $bytes_read mm. 'automagisk' sendes over.. ).
Måske man skulle poste en bug-report et sted..

/rené



Peter Makholm (19-09-2008)
Kommentar
Fra : Peter Makholm


Dato : 19-09-08 16:58

virker@ikke.nej (rené) writes:

> Det virker som om ideen ikke var helt gennemtænkt med det der
> hook-noed.. det ville være genialt hvis man kunne styre hvad der
> ellers ville blive sendt (når nu $filename og $bytes_read
> mm. 'automagisk' sendes over.. ).

Dit eksempel 2 viser ellers at det virker. Problemet er bare at du
ønsker at bruge nogle data, som du fxrst har til rådighed efter CGI er
initialiseret.

Det virker som det skal, det du ønsker at gøre kræver bare adgang til
nogle data før du får adgang til dem.

//Makholm

Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste