94 votes

Le téléchargement d'un fichier volumineux à l'aide de curl

J'ai besoin de télécharger un fichier distant à l'aide de curl.

Voici l'exemple de code que j'ai:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$st = curl_exec($ch);
$fd = fopen($tmp_name, 'w');
fwrite($fd, $st);
fclose($fd);

curl_close($ch);

Mais il ne peut pas gérer de gros fichiers, car il se lit à la mémoire de la première.

Est-il possible de transférer directement le fichier sur le disque?

183voto

TheBrain Points 2474
<?php
set_time_limit(0);
$fp = fopen (dirname(__FILE__) . '/localfile.tmp', 'w+');//This is the file where we save the    information
$ch = curl_init(str_replace(" ","%20",$url));//Here is the file we are downloading, replace spaces with %20
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp); // write curl response to file
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch); // get curl response
curl_close($ch);
fclose($fp);
?>

29voto

dynamic Points 16778

J'utilise cette fonction très pratique:

En le téléchargeant avec un 4094 octet de l'étape, il ne sera pas pleinement votre mémoire

function download($file_source, $file_target) {
    $rh = fopen($file_source, 'rb');
    $wh = fopen($file_target, 'w+b');
    if (!$rh || !$wh) {
        return false;
    }

    while (!feof($rh)) {
        if (fwrite($wh, fread($rh, 4096)) === FALSE) {
            return false;
        }
        echo ' ';
        flush();
    }

    fclose($rh);
    fclose($wh);

    return true;
}

Utilisation:

     $result = download('http://url','path/local/file');

Vous pouvez ensuite vérifier si tout est ok avec:

     if (!$result)
         throw new Exception('Download error...');

7voto

Chauhan Points 1315

Trouver code ci-dessous si vous souhaitez télécharger le contenu de l'URL spécifiée veulent aussi les enregistre dans un fichier.

<?php
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL,'http://news.google.com/news?hl=en&topic=t&output=rss');

$fp = fopen('rss.xml', 'w+');
/**
* Ask cURL to write the contents to a file
*/
curl_setopt($ch, CURLOPT_FILE, $fp);

curl_exec ($ch);

curl_close ($ch);
fclose($fp);
?>

Si vous voulez télécharger un fichier à partir du serveur FTP, vous pouvez utiliser le php FTP extension. Veuillez trouver ci-dessous le code:

<?php
$SERVER_ADDRESS="";
$SERVER_USERNAME="";
$SERVER_PASSWORD="";
$conn_id = ftp_connect($SERVER_ADDRESS);

// login with username and password
$login_result = ftp_login($conn_id, $SERVER_USERNAME, $SERVER_PASSWORD);

$server_file="test.pdf" //FTP server file path 
$local_file = "new.pdf"; //Local server file path 

##----- DOWNLOAD $SERVER_FILE AND SAVE TO $LOCAL_FILE--------##
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
    echo "Successfully written to $local_file\n";
} else {
    echo "There was a problem\n";
}

ftp_close($conn_id);
?>

4voto

prashant Points 11

lorsque curl est utilisé pour télécharger un gros fichier, puis CURLOPT_TIMEOUT est la principale option, vous devez définir pour.

CURLOPT_RETURNTRANSFER doit être vrai dans le cas où vous êtes l'obtention de fichier pdf/csv/image etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X