PostToHost mit Dateien

kevkev

Erfahrenes Mitglied
Hallo,

Ich will eine Datei über POST an ein anderes PHP-Script übertragen.
PHP:
<?php 

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);
		 $return .= $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 );
		 $return .= $ds;
     }
     $ds = "--".$bo."--\n";
     fputs($fp, $ds);

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

     return $res;
}

$filename = "homer.jpg";
$handle = fopen ($filename, "r");
$contents = fread ($handle, filesize ($filename));
fclose ($handle);

$xf="Content-Type: image/jpeg\n\n".$contents;

$data["userfile\"; filename=\"homer.jpg"]        = $xf;

$x = PostToHost (
       "kevin",
       80,
       "/test/test.php",
       "http://www.google.com",
       $data
      );
	  
echo "<pre>";  
echo $x;
echo "</pre>";
?>

Soweit sogut, nur das Problem ist das folgende:
Der Mime-Typ wird nicht übertragenm, d.h. die Datei selber kommt an, aber der Mime-Typ wird nicht richtig übertragen, denn die $_FILES ausgabe zeigt folgendes an:
Code:
Array
(
    [datei] => Array
        (
            [name] => impressum.php
            [type] => 
            [tmp_name] => C:\Programme\xampp\tmp\php73.tmp
            [error] => 0
            [size] => 538
        )

)

Hier fehlt nämlich type.
Woran kann das denn liegen? Ich habe den 'Content-Type' doch angegeben

Viell. könnt Ihr mir helfen :(!

Gruß Kevin
 
Es koennte daran liegen, dass Du schon nach der Content-Disposition 2 Zeilenumbrueche einfuegst.
Ausserdem sollten, wenn ich mich recht erinnere, laut RFC Zeilenumbrueche als \r\n geschrieben werden. \n funktioniert zwar auch, aber die "bessere" Variante ist wohl \r\n.

Ansonsten kann ich Dir natuerlich einen kleinen Blick in mein Tutorial HTTP ohne CURL empfehlen, wo auch der POST-Upload behandelt wird.
 
Hi,

Ja, das hatte Ich auch bemerkt, und zwar müßen 2 \n rein, wenn es sich um reine POST daten handelt, bei Dateien muss dann nur ein \n rein.

habe das Folgendermaßen gelößt:
PHP:
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) {
	 	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;
}

Gruß Kevin
 
Zurück