Kasper Johansen wrote:
> Hej gruppe.
>
>
> Jeg vil gerne (via et CLI-script) få PHP til at uploade en fil til en
> webserver.
>
> Som jeg forstår det, bliver hver enkelt fil adskildt af en udvalgt
> streng (jeg har valgt "-------------halluhallu").
>
> Derefter skal der postes "Content-type" til filen, derefter (adskildt af
> "\r\n") skal indholdet skrives.
>
> Men der sker absolut intet på min webserver, ved brug af følgende kode.
> Der er ingen fil, som bliver uploadet.
>
> Kan nogen fortælle mig, hvad jeg gør forkert, eller give et link til en
> god guide??
Det du gør forkert, er at du giver op for hurtigt. (Og så sjusker du
lidt her og der.) Lynhurtigt op som en ninja, og prøv lige en gang
mere. Håber mine hints er gode nok.
> Det jeg selv kom frem til var følgende:
>
> <?
> function http_post_file($host, $port, $site, $file){
> global $label_status, $progress;
>
> $label_status -> set_text("Forbinder til ......");
> updwin();
>
> $post .= "-------------halluhallu\r\n";
Detalje: Concatenerer streng med udefineret variabel. I dette tilfælde
betyder det ikke noget resultatmæssigt, men det giver ikke mening.
Skulle du ville genbruge noget kode og kopiere det et andet sted hen,
hvor du tilfældigvis har en defineret $post-variabel, går der kludder
i det.
> $post .= "Content-Dispotion: form-data; name=\"texfile\";
> filename=\"minzipfil.zip\"\r\n";
Skrive fejl: "Content-Dispotion" -> "Content-Disposition"
Uden betydning, men "texfile". Er det hvad du forventer i den anden ende?
> $post .= "Content-type: application/zip\r\n";
> $post .= "\r\n";
>
> $filesize = filesize($file);
> $count = 0;
>
> $headers .= "POST /" . $site . " HTTP/1.0\r\n";
Jeg ved ikke helt om "bare du selv kan finde ud af det", strækker helt
til her. Navnet på variablen og dens betydning i koden, hænger ikke
helt sammen. Det man skal angive er en path, men uden den første "/".
Det virker lidt bøvlet at have med at gøre. (og igen concat med
udefineret variabel)
Jeg vil foreslå at du til din funktion, bare har én parameter (istedet
for $host, $port, $site) der skal være den url der postes til, og som
du så splitter ad med "parse_url".
http://dk.php.net/manual/en/function.parse-url.php
Du skal bare være opmærksom på at 'port' kun kommer med hvis explicit
angivet.
> $headers .= "Content-type: multipart/form-data;
> boundary=-------------halluhallu\r\n";
Værdien af og valget af boundary er fin nok, men passer ikke sammen
med content-type headeren i din $post variabel.
http://www.faqs.org/rfcs/rfc1521.html
Se afsnit "7.2.1. Multipart: The common syntax"
Læs det der står om "encapsulation".
> $headers .= "Host: partyworm.dk\r\n";
> $headers .= "Connection: close\r\n";
> $headers .= "Content-Length: " . $post + $filesize . "\r\n";
Ok, en smutter, du mener vel nok "strlen($post) + $filesize". Men det
er ikke helt nok. Der mangler noget!
Fremgår af førnævnte afsnit i rfc'en.
> $headers .= "\r\n";
>
> $fp = fsockopen($host, $port);
> fwrite($fp, $headers);
Ok det var request-headerne, og efterfølgende sender du selve filen,
men hvad med "$post".
> $label_status -> set_text("Sender ZIP-fil...");
> updwin();
>
> $filep = fopen($file, "r");
> while(!feof($filep)){
> $content = fread($filep, 4096);
> $count += strlen($content);
> fputs($fp, $content);
>
> if ($count >= $lastcount){
> $lastcount = $count + (1024 * 128);
> $prog = $count / $filesize;
> $progress -> set_percentage($prog);
> }
> }
>
> $progress -> set_percentage(1);
Ok, det var selve indeholdet af filen. Her kommer så det der mangler
at blive talt med i "Content-Length".
> fclose($fp);
> fclose($filep);
>
> $label_status -> set_text("ZIP-filen blev uploadet...");
Du sender noget data og afbryder forbindelsen. I princippet ved du
ikke hvad der er blevet af de data.
Kommer lidt an på scriptet i den anden ende, hvor meget arbejde der
ligger i at finde ud af om tingene er gået godt. Som minimum må du
checke om du får en status 200 tilbage.
> updwin();
> }
> ?>
>
>
Lidt mere tørkost:
http://www.faqs.org/rfcs/rfc1867.html
Iøvrigt, når du nu vil efterligne en browser, så er det en god ide at
se hvad en browser sender, og sammenligne med det du har tænkt dig at
sende.
/Bent