/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
perl CGI upload og \&hook
Fra : rené


Dato : 19-09-08 08:17

Hej NG,

Det er nok lige på grænsen af denne gruppes emne, men jeg prøver
alligevel..

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? Er der nogen perl-hajer derude der kan være
behjælpelige? 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..

Mvh

/rené





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


Dato : 19-09-08 08:47

virker@ikke.nej (rené) writes:

> Det er nok lige på grænsen af denne gruppes emne, men jeg prøver
> alligevel..

En bedre gruppe ville nok være dk.edb.programmering.perl.


> 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..

Hvis du lader $data være en reference, vil du sandsynligvis kunne
registrere din hook og så fylde indhold i referencen inden den bliver
kaldt. Det vil altså sige noget ala:

my $id;
my $q = CGI->new(\&hook, \$id);

$$id = $q->param('id') || gen_new_id();

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

....
}


Men jeg ville nok bruge en hashref istedet for en scalarref, da dette
ville let mulighed for at overføre flere data senere og efter min
mening er lidt pænere:

my $data = { id => undef };
my $q = CGI->new( \&hook, $data );

$data->{id} = $q->param('id') || gen_new_id;

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

open my $counter, '>', $UploadDir . '/' . $filename . '-' . $data->{id};

...
}


Læs 'perldoc perlreftut' og 'perldoc perlref'.

//Makholm

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


Dato : 19-09-08 09:19

Peter Makholm skrev:

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

>> Det er nok lige på grænsen af denne gruppes emne, men jeg prøver
>> alligevel..

> En bedre gruppe ville nok være dk.edb.programmering.perl.

Jeg FUT'er dertil hvis dit tip nedenfor ikke fungerer :)

>> 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..

> Hvis du lader $data være en reference, vil du sandsynligvis kunne
> registrere din hook og så fylde indhold i referencen inden den bliver
> kaldt. Det vil altså sige noget ala:

> my $id;
> my $q = CGI->new(&hook, $id);

> $$id = $q->param('id') || gen_new_id();

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

> ....
> }

Det lyder som en ide jeg hellere må teste af med det samme :)

> Men jeg ville nok bruge en hashref istedet for en scalarref, da dette
> ville let mulighed for at overføre flere data senere og efter min
> mening er lidt pænere:

> my $data = { id => undef };
> my $q = CGI->new( &hook, $data );

> $data->{id} = $q->param('id') || gen_new_id;

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

> open my $counter, '>', $UploadDir . '/' . $filename . '-' .
$data->{id};

> ...
> }

> Læs 'perldoc perlreftut' og 'perldoc perlref'.

Så er der lidt at læse på mellem opkaldene på arbejdet :)

> //Makholm

/rené


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


Dato : 19-09-08 10:15

rené skrev:

> Peter Makholm skrev:

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

>>> Det er nok lige på grænsen af denne gruppes emne, men jeg prøver
>>> alligevel..

>> En bedre gruppe ville nok være dk.edb.programmering.perl.


Det fungerede ikke, så jeg 'plager' perl-gruppen istedet. Tak for
indsatsen.

Mvh

/rené


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

Månedens bedste
Årets bedste
Sidste års bedste