PHP Pass Datei-Handle zu Benutzer, so dass Datei-Downloads und speichert sie in ihre Maschine
-
22-08-2019 - |
Frage
Ich bin eine Datei von einem anderen Server herunterzuladen. Ich wünsche, diese Datei zu meinen Benutzern zu schieben, anstatt es auf meinen Server zu speichern.
Mit anderen Worten, sie die Datei Handle übergeben, damit es passiert einfach durch meinen Server und speichert sie auf ihre Maschine. Wie kann ich das machen? Ich habe dies so weit:
$handle = fopen($_GET['fileURL'], 'r');
$filename = stream_get_contents($handle);
Wie schiebe ich dies den Benutzer, vielleicht Header mit?
Vielen Dank für jede Hilfe und Richtung.
EDIT
Ich habe die Header:
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
Es ist nur, dass es nicht schieben die Header. Ich bekomme nur eine leere Seite nach ca. 15 Sekunden, die wie er die Datei herunterzuladen, aber nicht gibt es mir aussieht.
Ich möchte für das Skript sofort die Header an den Benutzer als Stream senden. Ausfahrt();
Lösung
Sie können versuchen, diese
$filetype = mime_content_type($filename);
header('Content-type: '.$filetype);
header('Content-Disposition: attachment; filename="'.$filename.'"');
UPDATE für Ihren EDIT:
Haben Sie Fehler deaktiviert haben, da diese, wie die Header-Sounds Fehler bereits gesendet?
error_reporting(E_ALL | E_STRICT);
Andere Tipps
Sie müssen fopen nicht verwenden () bei der Verwendung von Readfile ();
schließen Sie einfach den Dateinamen innerhalb ReadFile- () wie folgt aus:
readfile($_GET['fileUrl']);
Obwohl dies sehr gefährlich sicherheits klug ist, wenn der Benutzer eine beliebige Datei auf dem Dateiserver angeben können. Wenn Sie nur ein paar Dateien haben Sie jemanden zum Download in der Lage sein wollen, vielleicht sollten Sie sie in einem Array speichern (oder Datenbank, preferebly)
Hier ist ein Array Beispiel:
$files = array('file1.jpg', 'file2.png', 'file3.pdf');
//assume $_GET['file_id'] == 0, 1 or 2
if (file_exists($files[$_GET['file_id']]))
readfile($files[$_GET['file_id']]);