dclp FAQ

FAQ der Newsgroups de.comp.lang.php.*

 
  • Increase font size
  • Default font size
  • Decrease font size

Häufig benötigte Codeschnipsel

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

E-MailDruckenPDFLesezeichen anlegen: Du musst dich einloggen um ein Lesezeichen für diesen Beitrag anzulegen. Es wird deiner persönlichen Lesezeichenliste hinzugefügt.

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;
}
 
// Für eine ASCII-Datei kann man es so machen
// bei bin-Daten über 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);
 
?>
Wie kann ich einen HTTP POST-Request mit Datei-Upload absenden?
http://php-faq.de/q-code-upload.html
 

dclp FAQ


Login