386 Stimmen

Datei von URL auf Server herunterladen

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 beim Herunterladen auf die Festplatte zu schreiben. Auf diese Weise kann ich größere Dateien herunterladen, ohne Speicherprobleme zu bekommen.

580voto

alex Punkte 457905

Seit PHP 5.1.0, file_put_contents() unterstützt stückweises Schreiben durch Übergabe eines Stream-Handles als $data Parameter:

file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));

Aus dem Handbuch:

Si Daten [das ist das zweite Argument] eine Stream-Ressource ist, wird der verbleibende Puffer dieses Streams in die angegebene Datei kopiert. [ ] stream_copy_to_stream() .

(Dank Hakre .)

141voto

xaav Punkte 7578
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);
    }
}

74voto

prodigitalson Punkte 59250

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 dem CURLOPT_FILE Option wird geschrieben, wenn die Daten abgerufen werden, also nicht gepuffert.

29voto

Kamil Kiełczewski Punkte 69048

Wunderkind Antwort hat bei mir nicht funktioniert. Ich habe missing fopen in CURLOPT_FILE mehr Details .

Das hat bei mir funktioniert, einschließlich lokaler URLs:

function downloadUrlToFile($url, $outFileName)
{   
    if(is_file($url)) {
        copy($url, $outFileName); 
    } else {
        $options = array(
          CURLOPT_FILE    => fopen($outFileName, 'w'),
          CURLOPT_TIMEOUT =>  28800, // set this to 8 hours so we dont timeout on big files
          CURLOPT_URL     => $url
        );

        $ch = curl_init();
        curl_setopt_array($ch, $options);
        curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return $httpcode;
    }
}

20voto

stra8edge Punkte 209
  1. Erstellen Sie einen Ordner mit dem Namen "Downloads" auf dem Zielserver
  2. Speichern Sie [diesen Code] in .php Datei und Ausführung auf dem Zielserver

Downloader :

<html>
<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" />
</form>
<?php
    // maximum execution time in seconds
    set_time_limit (24 * 60 * 60);

    if (!isset($_POST['submit'])) die();

    // folder to save downloaded files to. must end with slash
    $destination_folder = 'downloads/';

    $url = $_POST['url'];
    $newfname = $destination_folder . basename($url);

    $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);
    }
?>
</html>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X