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 | ||