Mit PHP Formular (Dateiupload) verschicken
steffen
- php
Hallo Leute,
wir programmieren Lancoms mit einem selbsterstellten Script, dass wir mit PHP erzeugen. Um das ganze noch etwas besser zu gestallten, möchten wir das ganze auch automatisch auf den Lancom hochladen lassen. Dazu hat der Lancom im Interface ein Uploadformular.
Nun muss ich wissen, wie genau ich das ansteuer. Hab ein bisschen rumgeschaut und das hier gefunden:
function doPost($uri,$postdata,$host){
echo $host;
$da = fsockopen($host, 80, $errno, $errstr);
$data_f=fread($da, 1000);
echo $data_f;
if (!$da) {
echo "$errstr ($errno)<br/>\n";
echo $da;
}
else {
$salida ="POST $uri HTTP/1.1\r\n";
$salida.="Host: $host\r\n";
$salida.="User-Agent: PHP Script\r\n";
$salida.="Content-Type: application/x-www-form-urlencoded\r\n";
$salida.="Content-Length: ".strlen($postdata)."\r\n";
$salida.="Connection: close\r\n\r\n";
$salida.=$postdata;
fputs($da, $salida);
/*while (!feof($da))
$response.=fgets($da, 128);
$response=split("\r\n\r\n",$response);
$header=$response[0];
$responsecontent=$response[1];
if(!(strpos($header,"Transfer-Encoding: chunked")===false)){
$aux=split("\r\n",$responsecontent);
for($i=0;$i<count($aux);$i++)
if($i==0 || ($i%2==0))
$aux[$i]="";
$responsecontent=implode("",$aux);
}//if
return chop($responsecontent);*/
}
}
$postdata = urlencode('./user/name.lcs');
$dns_name = "lancom-" . $_REQUEST['item16'];
$host = gethostbyname($dns_name);
$uri = "/loadconf/doit";
doPost($uri,$postdata,$host);
Da die while schleife ein dauerladen der seite verursachte und im Endefekt nur dazu dient, dass eine Ausgabe erscheint, habe ich diese erstmal auskommentiert.
$host wird ausgegeben, aber $data_f ist leider leer.
Weiß jemand rat? Stimmt der Code überhaupt, dass ich damit ein Dateiupload verschicken kann?
Danke für eure Hilfe.
Hello,
Nun muss ich wissen, wie genau ich das ansteuer. Hab ein bisschen rumgeschaut und das hier gefunden:
[code lang=php] function doPost($uri,$postdata,$host){
echo $host;
$da = fsockopen($host, 80, $errno, $errstr);
$data_f=fread($da, 1000);
echo $data_f;
if (!$da) {
echo "$errstr ($errno)<br/>\n";
echo $da;
}
Leider ist der Code überhaupt nicht dokumentiert.
Unter Dokumentation verstehe ich nicht, (nur) zu übersetzen, was die Statements bewirken, de dort stehen, sondern eher, warum man diese Stastements nun benutzt, was deren grobe und feinere Ziele sind.
Mich würde nun z.B. die Intention interessieren, mit der aus einem gerade angesprochenen Port 80 ohne Angabe eines Protokolls und/oder eines speziellen Timeouts, ohne den Erfolg des Öffnens und den Errorcode abzufragen nebst erweiterterter Fehlermeldung, 1000 Bytes angefordert werden.
Wozur macht das Script das so?
Ich hätte vermutlich nach einer Abfrage auf if($da) mit dem im else-Zweig befindlichen Code begonnen. Absetzen eines Requests an den Port.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo Tom,
derzeit schaut der jetzige Stand der funktion so aus:
function PostToHost($host, $port, $path, $referer, $data_to_send)
{
echo "test";
$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) {
if (preg_match("/filename/i", $key)) {
$n = "\n";
} else {
$n = "\n\n";
}
$ds =sprintf("--%s\nContent-Disposition: form-data; name=\"%s\"".$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) {
if (preg_match("/filename/i", $key)) {
$n = "\n";
} else {
$n = "\n\n";
}
$ds =sprintf("--%s\nContent-Disposition: form-data; name=\"%s\"".$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;
}
$dns_name = "lancom-" . $_POST['item16'];
$host = gethostbyname($dns_name);
$port = 80;
$path = "/loadconf/doit";
$referer = "lancom-" . $_POST['item16'] . "/loadconf/";
$fa = @file("./user/" . ($ip_factor) . "." . $_POST['item4'] . ".lcs");
$xf="Content-Type: application\n\n". implode("", $fa);
$data["file\"; filename=\"" . ($ip_factor) . "." . $_POST['item4'] . ".lcs"] = $xf;
$x = PostToHost($host, $port, $path, $referer, $data);
Das klappt auch eigentlich ganz gut und ich bekomme auch die eigentliche Seite angezeigt, in der stht, dass der Upload erfolgreich war, jedoch wenn ich dann auf den Router schaue ist dort keine Config augespielt.
Zudem würde ich gerne Erfahren, wass genau das Boundary bedeutet, bzw wieso ich die ausgerechnet diesen Zahlencode brauche.
Genutzt habe ich diesen Beispiel: http://www.php-faq.de/q-code-upload.html
Jedoch frage ich mit, wieso ich das Die hochzuladene Datei einlesen muss.
Vielleicht könnt ihr mir helfen wäre sehr dankbar dafür :)
mfg steffen
Hello,
derzeit schaut der jetzige Stand der funktion so aus:
[code lang=php]function PostToHost($host, $port, $path, $referer, $data_to_send)
{
echo "test";
$dc = 0;
$bo="-----------------------------305242850528394";$fp = fsockopen($host, $port, $errno, $errstr);
if (!$fp) {
echo "errno: $errno \n";
echo "errstr: $errstr\n";
return $result;
### woher stammt $result? Wäre es nicht besser, irgendwie einen Errorcode zum Aufrufer zu bringen?
}
Ich schau mir das nachher nochmal in Ruhe an.
Die Boundary benötigt man, um (multiple) Contents von den Headern und voneinander zu trennen.
Das Senden von Daten sollte möglichst, genauso wie das Empfangen von Daten, in Portionen bis maximal 512 Bytes geschehen. Anderenfalls kann es Probleme mit der Kommunikation geben.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg