Laden Sie die Datei von der URL auf den Server herunter

Lesezeit: 2 Minuten

Laden Sie die Datei von der URL auf den Server
xaav

Nun, das scheint ziemlich einfach zu sein, und das ist es 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"));

Nur gibt es ein Problem. Was ist, wenn Sie eine große Datei haben, z. B. 100 MB? Dann wird Ihnen der Arbeitsspeicher ausgehen und Sie können die Datei nicht 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 dass Speicherprobleme auftreten.

  • Das ist in Ihrer Serverkonfiguration eingestellt, PHP kann es meines Wissens nicht wirklich umgehen (außer einer direkten .ini-Bearbeitung)

    – Ben

    15. Oktober 2010 um 0:12 Uhr


Laden Sie die Datei von der URL auf den Server
Alex

Seit PHP 5.1.0, file_put_contents() unterstützt das stückweise Schreiben, indem ein Stream-Handle als übergeben wird $data Parameter:

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

Aus dem Handbuch:

Wenn Daten [that is the second argument] eine Stream-Ressource ist, wird der verbleibende Puffer dieses Streams in die angegebene Datei kopiert. Ähnlich verhält es sich mit der Verwendung
stream_copy_to_stream().

(Dank Hakre.)

  • Das wäre nicht meine erste Wahl. Wenn allow_fopen_url Off in php.ini gesetzt ist (gute Idee für die Sicherheit), wäre Ihr Skript kaputt.

    – Bitte stehen

    15. Oktober 2010 um 0:43 Uhr

  • @idealmachine denke ich file_get_contents() würde auch nicht funktionieren, wenn das der Fall wäre (siehe OP).

    – Alex

    15. Oktober 2010 um 0:45 Uhr

  • @geoff Ich war spezifisch, ich habe die gewünschte Funktion erwähnt. Was Sie vielleicht wollten, war jemand, der den Code für Sie schreibt – aber ich bin sicher, dass Sie etwas gelernt haben, indem Sie es selbst gemacht haben. Auch wenn wir die SO-Interaktionen des anderen kommentieren – akzeptieren Sie bitte weitere Antworten 🙂

    – Alex

    15. Oktober 2010 um 1:37 Uhr


  • @alex: Bitte sehen Sie sich die Bearbeitung an, Sie können sie gerne einarbeiten. lass es mich wissen, wenn ich diesen Kommentar hier dann entfernen kann.

    – hakre

    31. März 2013 um 14:20 Uhr

  • Das ‘b’-Flag sollte in den meisten Fällen auch mit verwendet werden fopen; verhindert nachteilige Auswirkungen auf Bilder und andere Nicht-Textdateien.

    – Wayne Weibel

    12. September 2013 um 18:48 Uhr

Laden Sie die Datei von der URL auf den Server
xaav

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);
    }
}

  • danke für deinen Ausschnitt, aber könntest du deinen Code @xaav erklären? Ich bin nicht gerade brillant in PHP. Wofür ist 1024*8? Danke noch einmal.

    – vvMINOvv

    10. Dezember 2011 um 14:19 Uhr


  • @wMINOW Die Länge der Zeile.

    – David Belanger

    11. Juni 2012 um 20:47 Uhr

  • Konkret bedeutet dies, bis zu 8 KB gleichzeitig zu lesen (1024 Bytes pro KB * 8), da der Parameter in Bytes angegeben ist. Solange die Zeile <= 8 KB ist, wird die gesamte Zeile auf einmal gelesen.

    –Doktor J

    27. September 2012 um 13:49 Uhr

  • Warum ist das nicht die beste Antwort?

    – Gun Jack

    17. Dezember 2013 um 18:30 Uhr

  • Wie gehen Sie bei diesem Ansatz mit Fehlern um? Was ist, wenn ein 404 zurückgegeben wird oder die Verbindung unterbrochen wird oder das Zeitlimit überschritten wird?

    – Adam Swinden

    29. Dezember 2014 um 11:33 Uhr

Laden Sie die Datei von der URL auf den Server
prodigitalson

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, die es schreibt, während es die Daten zieht, dh. nicht gepuffert.

  • Normalerweise wäre das in Ordnung, aber ich habe diesen Code in einer Web-App, daher kann ich nicht sicher sein, dass Benutzer cURL installiert haben. Allerdings habe ich diesem eine Stimme gegeben.

    – xaav

    15. Oktober 2010 um 0:29 Uhr


  • @Geoff ist es eine verteilte Web-App? Denn wenn Sie das Hosting kontrollieren, dann spielt es keine Rolle für Ihre Benutzer (cURL ist eine Bibliothek auf Ihrem Server).

    – Alex

    15. Oktober 2010 um 0:47 Uhr

  • Nein. Ich kontrolliere das Hosting nicht. Es ist eine verteilte Web-App, die jeder haben könnte.

    – xaav

    15. Oktober 2010 um 1:26 Uhr

  • Curl fehlt möglicherweise. Aber fast alle Shared-Hosting-Unternehmen haben CURL standardmäßig installiert. Ich meine, ich habe noch keinen gesehen, der das nicht tut.

    – Mangirdas Skripka

    14. Juli 2012 um 17:12 Uhr

  • Wie aus meinen Tests hervorgeht, können Sie CURLOPT_FILE keinen Dateipfad direkt zuweisen. Es muss ein Filehandler sein. Öffnen Sie zunächst die Datei mit $fh = fopen('/path/to/download/the/file/to.zip', 'w'); und schließen mit fclose($fh); nach dem curl_close($ch);. Und eingestellt CURLOPT_FILE => $fh

    – Gustav

    7. Mai 2016 um 1:06 Uhr

1646931248 892 Laden Sie die Datei von der URL auf den Server
Kamil Kielczewski

Die Antwort von prodigitalson 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;
    }
}

        

1646931248 288 Laden Sie die Datei von der URL auf den Server
gerade Kante

  1. Erstellen Sie auf dem Zielserver einen Ordner namens „Downloads“.
  2. Speichern [this code] hinein .php Datei und auf dem Zielserver ausführen

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> 

  • Dies setzt voraus, dass der Benutzer eher ein eigenständiges Skript als eine Lösung wünscht, die in einer vorhandenen PHP-Anwendung funktioniert, und ich glaube, letzteres ist das, wonach das OP und die meisten anderen suchen. Eine Erklärung wäre auch hilfreich für Leute, die den Ansatz verstehen wollen.

    – Sean die Bohne

    20. Mai 2016 um 20:27 Uhr

  • Immer wenn ich das versuche, ist meine übertragene Dateigröße 50816, aber meine Dateigröße ist größer als 120 MB. Irgendeine Idee, warum das so ist?

    – Riffaz Starr

    6. Mai 2017 um 16:49 Uhr

  • set_time_limit (24 * 60 * 60); muss in eine Schleife gelegt werden. Am Anfang des Skripts hat es keine Auswirkung.

    – Viktor Joras

    23. April 2018 um 15:17 Uhr

  • So laden Sie von dieser URL herunter: filehippo.com/download_mozilla-firefox-64/post_download

    – Saurin Dashadia

    10. Juli 2020 um 13:38 Uhr

1646931249 577 Laden Sie die Datei von der URL auf den Server
Vijaysinh Parmar

set_time_limit(0); 
$file = file_get_contents('path of your file');
file_put_contents('file.ext', $file);

  • Dies setzt voraus, dass der Benutzer eher ein eigenständiges Skript als eine Lösung wünscht, die in einer vorhandenen PHP-Anwendung funktioniert, und ich glaube, letzteres ist das, wonach das OP und die meisten anderen suchen. Eine Erklärung wäre auch hilfreich für Leute, die den Ansatz verstehen wollen.

    – Sean die Bohne

    20. Mai 2016 um 20:27 Uhr

  • Immer wenn ich das versuche, ist meine übertragene Dateigröße 50816, aber meine Dateigröße ist größer als 120 MB. Irgendeine Idee, warum das so ist?

    – Riffaz Starr

    6. Mai 2017 um 16:49 Uhr

  • set_time_limit (24 * 60 * 60); muss in eine Schleife gelegt werden. Am Anfang des Skripts hat es keine Auswirkung.

    – Viktor Joras

    23. April 2018 um 15:17 Uhr

  • So laden Sie von dieser URL herunter: filehippo.com/download_mozilla-firefox-64/post_download

    – Saurin Dashadia

    10. Juli 2020 um 13:38 Uhr

1646931249 131 Laden Sie die Datei von der URL auf den Server
Hoan Huynh

Es gibt 3 Möglichkeiten:

  1. file_get_contents und file_put_contents
  2. LOCKE
  3. föffnen

Sie können Beispiele finden von hier.

988500cookie-checkLaden Sie die Datei von der URL auf den Server herunter

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy