2017-11-30 6 views
0

TL; DR: Warum funktioniert das erneute Hochladen der hochgeladenen Daten nicht?Warum funktioniert mein PHP-Upload nicht?

Ich versuche, die Daten, die ein Benutzer in meine Datei hochgeladen hat, auf einen anderen Server hochzuladen. Das heißt, ich möchte meine Postdaten posten.

Ich möchte einige Daten auf upload.php hochladen, die dann auf test.php (die einfach die rohen Postdaten ausgibt) gebucht werden soll. Und aufgrund der Speicherersparnis wollte ich, dass es funktioniert, ohne die Nachricht als ganze Nachricht zu erzeugen. Also möchte ich auch nicht curl verwenden.

test.php

<?php 
echo 'foo', file_get_contents('php://input'), 'bar'; 

upload.php

<?php 
//new line variable 
$NL = "\r\n"; 

//open the posted data as a resource 
$client_upload = fopen('php://input', 'r'); 
//open the connection to the other server 
$server_upload = fsockopen('ssl://example.com', 443); 

//write the http headers to the socket 
fwrite($server_upload, 'POST /test.php HTTP/1.1' . $NL); 
fwrite($server_upload, 'Host: example.com' . $NL); 
fwrite($server_upload, 'Connection: close' . $NL); 
//header/body divider 
fwrite($server_upload, $NL); 

//loop until client upload reached the end 
while (!feof($client_upload)) { 
    fwrite($server_upload, fread($client_upload, 1024)); 
} 
//close the client upload resource - not needed anymore 
fclose($client_upload); 

//intitalize response variable 
$response = ''; 
//loop until server upload reached the end 
while (!feof($server_upload)) { 
    $response .= fgets($server_upload, 1024); 
} 
//close the server upload resource - not needed anymore 
fclose($server_upload); 

//output the response 
echo $response; 

Wenn I { "test": true } (von Fiedler) zu test.php Datei schreiben, es foo{ "test": true }bar ausgibt.

Jetzt, wenn ich versuche, das gleiche für upload.php zu tun, bekomme ich nur foobar (und die http-Header von test.php), aber nicht den hochgeladenen Inhalt.

Antwort

1

Schließlich gelang es mir dieses Fehler zu beheben. Anscheinend hängt der andere Server (und meins) von dem HTTP-Header Content-Length ab.

Wie Sie in meiner Antwort sehen können, habe ich diesen Header nicht gesendet (nicht berechnet). Als ich nun endlich den Content-Length Header berechnet und gesendet habe, hat alles funktioniert. Das sind die fehlenden Zeilen:

$content_length = fstat($client_upload)['size']; 
fwrite($server_upload, 'Content-Length: ' . $content_length . $NL); 

Die reupload (der hochgeladenen Daten auf meinen Server) funktionierten nicht, weil der andere Server den Körper gerade gelesen, solange es in den Content-Length Header angegeben wurde. Da ich diesen Header nicht gesendet habe, hat es nicht funktioniert.