Last ned fil til server fra URL

Dette virker ganske enkelt, og det er det også. Alt du trenger å gjøre for å laste ned en fil til serveren din er:

file_put_contents("Tmpfile.zip", file_get_contents("http://someurl/file.zip"));

Det er bare ett problem. Hva om du har en stor fil, som 100 MB. Da vil du gå tom for minne og ikke kunne laste ned filen.

Det jeg ønsker er en måte å skrive filen til disken mens jeg laster den ned. På den måten kan jeg laste ned større filer uten å få minneproblemer.

Løsning

Siden PHP 5.1.0 støtter file_put_contents() skriving bit-for-bit ved å sende en stream-handle som $data-parameter:

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

Fra håndboken:

Hvis data [som er det andre argumentet] er en strømressurs, vil den gjenværende bufferen av den strømmen kopieres til den angitte filen. Dette er på samme måte som ved bruk av stream_copy_to_stream().

(Takk til Hakre.)

Kommentarer (8)
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);
    }
}
Kommentarer (16)

Prøv å bruke 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);

Jeg er ikke sikker, men jeg tror at med CURLOPT_FILE-alternativet skriver den når den henter dataene, dvs. ikke bufret.

Kommentarer (5)