Nun, diese Aufgabe scheint recht einfach zu sein, und das ist sie auch. Alles, was Sie tun müssen, um eine Datei auf Ihren Server herunterzuladen, ist:
file_put_contents("Tmpfile.zip", file_get_contents("http://someurl/file.zip"));
Es gibt nur ein Problem. Was ist, wenn Sie eine große Datei haben, etwa 100 MB. Dann geht Ihnen der Speicher aus, und Sie können die Datei nicht mehr herunterladen.
Was ich möchte, ist eine Möglichkeit, die Datei auf die Festplatte zu schreiben, während ich sie herunterlade. Auf diese Weise kann ich größere Dateien herunterladen, ohne Speicherprobleme zu bekommen.
Seit PHP 5.1.0 unterstützt file_put_contents()
das stückweise Schreiben durch Übergabe eines Stream-Handles als Parameter $data
:
file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));
Aus dem Handbuch:
Wenn data [das zweite Argument] eine Stream-Ressource ist, wird der verbleibende Puffer dieses Streams in die angegebene Datei kopiert. Dies ist ähnlich wie bei der Verwendung von
stream_copy_to_stream()
.
(Dank an Hakre.)
private function downloadFile($url, $path)
{
$newfname = $path;
$file = fopen ($url, 'rb');
if ($file) {
$newf = fopen ($newfname, 'wb');
if ($newf) {
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
}
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
}
Versuchen Sie es mit cURL
set_time_limit(0); // unlimited max execution time
$options = array(
CURLOPT_FILE => '/path/to/download/the/file/to.zip',
CURLOPT_TIMEOUT => 28800, // set this to 8 hours so we dont timeout on big files
CURLOPT_URL => 'http://remoteserver.com/path/to/big/file.zip',
);
$ch = curl_init();
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
Ich bin mir nicht sicher, aber ich glaube, mit der Option CURLOPT_FILE
werden die Daten so geschrieben, wie sie abgerufen werden, also nicht gepuffert.