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

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
POST med sockets
Fra : Kasper Johansen


Dato : 29-01-06 12:16

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 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";
      $post .= "Content-Dispotion: form-data; name=\"texfile\";
filename=\"minzipfil.zip\"\r\n";
      $post .= "Content-type: application/zip\r\n";
      $post .= "\r\n";
      
      $filesize = filesize($file);
      $count = 0;
      
      $headers .= "POST /" . $site . " HTTP/1.0\r\n";
      $headers .= "Content-type: multipart/form-data;
boundary=-------------halluhallu\r\n";
      $headers .= "Host: partyworm.dk\r\n";
      $headers .= "Connection: close\r\n";
      $headers .= "Content-Length: " . $post + $filesize . "\r\n";
      $headers .= "\r\n";
      
      $fp = fsockopen($host, $port);
      fwrite($fp, $headers);
      
      $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);
      
      fclose($fp);
      fclose($filep);
      
      $label_status -> set_text("ZIP-filen blev uploadet...");
      updwin();
   }
?>


--
Med venlig hilsen
Kasper Johansen

 
 
Frederik Sunne (30-01-2006)
Kommentar
Fra : Frederik Sunne


Dato : 30-01-06 14:13

Kasper Johansen wrote:
> Hej gruppe.
>
>
> Jeg vil gerne (via et CLI-script) få PHP til at uploade en fil til en
> webserver.
Hvorfor ikke bare gøre det via FTP?

Mvh,

Frederik

Bent Stigsen (31-01-2006)
Kommentar
Fra : Bent Stigsen


Dato : 31-01-06 12:37

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

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

Månedens bedste
Årets bedste
Sidste års bedste