25.3. Wie kann ich einen HTTP POST-Request mit Datei-Upload absenden?Antwort von Andreas Bohne-LangDas 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); ?> |
||
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 |