de.comp.lang.php.* FAQ

25.3. Wie kann ich einen HTTP POST-Request mit Datei-Upload absenden?

Keywords: POST | multipart | File | upload | Datei

Antwort von Andreas Bohne-Lang

Das Script muss einen Socket mit der Funktion fsockopen() zum Zielserver öffnen und auf diesem Socket dann einen HTTP POST-Request mit Datei-Upload simulieren.

Das Beispiel baut eine HTTP-Anfrage konform der multipart/form-data Beschreibung auf und sendet diese dann ab. Dabei wird eine ASCII-Datei eingelesen und übergeben.

Bei multipart/form-data werden die Daten so übergeben:

...
Content-type: multipart/form-data; boundary=---------------------------255141413922088
Content-Length: 6881

-----------------------------255141413922088
Content-Disposition: form-data; name="disk"

off
-----------------------------255141413922088
...
-----------------------------255141413922088--

Dieses Stück Beispielcode sendet einen solchen Request ab:

#!/usr/local/bin/php -q

<?php

// Andreas Bohne-Lang / a.bohne@dkfz.de / 22.10.2001 / GPL
// Ergaenzt: 19.9.2003

function PostToHost($host, $port, $path, $referer, $data_to_send)
{
     $dc = 0;
     $bo="-----------------------------305242850528394";

     $fp = fsockopen($host, $port, $errno, $errstr);
     if (!$fp) {
         echo "errno: $errno \n";
         echo "errstr: $errstr\n";
         return $result;
     }

     fputs($fp, "POST $path HTTP/1.0\n");
     fputs($fp, "Host: $host\n");
     fputs($fp, "Referer: $referer\n");
     fputs($fp, "User-Agent: Mozilla/4.05C-SGI [en] (X11; I; IRIX 6.5 IP22)\n");
     fputs($fp, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\n");
     fputs($fp, "Accept-Charset: iso-8859-1,*,utf-8\n");
     fputs($fp, "Content-type: multipart/form-data; boundary=$bo\n");

     foreach($data_to_send as $key=>$val) {
         $ds =sprintf("--%s\nContent-Disposition: form-data; name=\"%s\"\n\n%s\n", $bo, $key, $val);
         $dc += strlen($ds);
     }
     $dc += strlen($bo)+3;
     fputs($fp, "Content-length: $dc \n");
     fputs($fp, "\n");

     foreach($data_to_send as $key=>$val) {
         $ds =sprintf("--%s\nContent-Disposition: form-data; name=\"%s\"\n\n%s\n", $bo, $key, $val);
         fputs($fp, $ds );
     }
     $ds = "--".$bo."--\n";
     fputs($fp, $ds);

     while(!feof($fp)) {
         $res .= fread($fp, 1);
     }
     fclose($fp);

     return $res;
}

// Fuer eine ASCII-Datei kann man es so machen
// bei bin-Daten ueber fread gehen

$fa = @file("http://www.dkfz.de/spec/fix/file.pdb");

// Konkretes Beispiel - Eine Chemie-Datei
$xf="Content-Type: chemical/x-pdb\n\n". implode("", $fa);

$data["disk"]            = "on";
$data["file\"; filename=\"irgendwas.pdb"]        = $xf;
$data["smiles"]          = "";
$data["hadd"]            = "add";
$data["aroresolver"]     = "on";
$data["format"]          = "gif";
$data["interlace"]       = "1";
$data["width"]           = "600";
$data["height"]          = "400";
$data["atomcolor"]       = "Black";
$data["asymbol"]         = "xsymbol";
$data["hcolor"]          = "";
$data["csymbol"]         = "special";
$data["hsymbol"]         = "special";
$data["bondcolor"]       = "Black";
$data["bgcolor"]         = "White";
$data["border"]          = "12";
$data["bonds"]           = "8";
$data["wedges"]          = "1";
$data["dashes"]          = "1";
$data["crop"]            = "2";
$data["align"]           = "none";
$data["coord"]           = "0";
$data["imagemap"]        = "none";
$data["headercolor"]     = "Black";
$data["header"]          = "";
$data["footercolor"]     = "Black";
$data["footer"]          = "";
$data["commenttype"]     = "none";
$data["comment"]         = "";
$data["structure"]       = "none";

$x = PostToHost (
       "www2.chemie.uni-erlangen.de",
       80,
       "/cgi-bin/services/gifcreator.tcl",
       "http://www2.chemie.uni-erlangen.de/services/gifcreator/index.html",
       $data
      );


// Diesen Teil kann man bestimmt noch optimieren ;-)
$fp = fopen("struktur.gif", "wb");
$tok = 0;
for ($i=20; $i<strlen($x); $i++){
    if ((substr($x,$i,1)=="\n") || (substr($x,$i,1)=="\r")) {
        $tok++;
        if($tok>=3) break;
    } else {
        $tok=0;
    }
}
$i++; $i++;
printf(" %d %d %d \n", $i, strlen($x), strlen($x)-$i);
fwrite($fp, substr($x,$i,strlen($x)-$i));
fclose($fp);

$fp = fopen("struktur.xxx", "wb");
fwrite($fp, $x, strlen($x));
fclose($fp);

?>

Valid HTML 4.01! Valid CSS!

25.3. Wie kann ich einen HTTP POST-Request mit Datei-Upload absenden?
http://www.php-faq.de/q/q-code-upload.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team