DATAtourisme

Récupération du fichier ZIP via PHP Curl

Bonjour,

Je recherche désespérément de simplement télécharger le fichier zip via un script PHP qui tournera sur une tache cron.

Voici mon script tout simple…
Dans ce test j’ai même simuler un header de navigateur, car depuis ce dernier le fichier en téléchargement se lance bien… je suis un peu perdu et dubitatif.

Si une âme charitable pouvait me donner un coup de pouce.
Merci à vous

$url = ‹ https://diffuseur.datatourisme.fr/webservice/FLUX/APIKEY ›;
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// Simuler un navigateur
curl_setopt($ch, CURLOPT_USERAGENT, ‹ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 ›);

curl_setopt($ch, CURLOPT_ENCODING, «  »);

$response = curl_exec($ch);

if(curl_errno($ch)){
echo 'Erreur cURL : ’ . curl_error($ch);
} else {
$downloadedFilePath = ‹ /datatourisme/datas.zip ›;
file_put_contents($downloadedFilePath, $response);
echo ‹ Téléchargement réussi. ›;
}

curl_close($ch);

Bonjour Benoit

Voici une classe que j’utilise dans un plugin Wordpress

<?php
class ric_import_datatourisme {

    /* Connexion avec DATAtourisme */
    public static $GlobalFileHandle = null; // stockage temporaire des données reçus par Curl
    public static $curlStatus;
    public static $curlHeaders;
    // Fonction d'importation des données DATAtourisme

    public static function importDATAtourisme() {

        // Si les dernières données ne sont pas toutes indexées, il ne faut pas faire la maj
        $ric_datatourisme_newdatas = get_option( 'ric_datatourisme_newdatas' );
        if ( $ric_datatourisme_newdatas === true ) { // non terminé, la maj attendra
            exit();
        }

        // Il faut indiquer à tous les autres traitements de stopper leur travail
        update_option('ric_datatourisme_maj_encours', true);

        $reponses = array();
        $reponses[] = date('Y-m-d H:i:s');

        $ric_datatourisme_webservice_url = get_option( 'ric_datatourisme_webservice_url' );
        if ( !$ric_datatourisme_webservice_url || $ric_datatourisme_webservice_url == '') {
            $reponses[] = 'Merci de renseigner dans "Réglages", la valeur de l\'URL du webservice complète avec sa clé API';
            return $reponses;
            exit();
        }

        set_time_limit(0); // no script timeout
        $destination_dir = plugin_dir_path( __FILE__ )."../../rowdatas/";

        // Importation
        $rowdatas_temp_file = $destination_dir.'datas.temp';
        ric_import_datatourisme::$GlobalFileHandle = fopen($rowdatas_temp_file, 'w+');

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $ric_datatourisme_webservice_url);
        curl_setopt($ch, CURLOPT_FILE, ric_import_datatourisme::$GlobalFileHandle);
        curl_setopt($ch,CURLOPT_ENCODING , 'gzip');
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'ric_import_datatourisme::captureHeader');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, -1);
        curl_setopt($ch, CURLOPT_VERBOSE, false);
        curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'ric_import_datatourisme::curlWriteFile');
        $curlResponse = curl_exec($ch);
        // Gestion des erreurs
        if( $curlResponse === false) {
            $reponses[] = 'Erreur Curl : ' . curl_error($ch);
        } else {
            $reponses[] = 'Le téléchargement s\'est terminé sans aucune erreur';
            // Récupération du nom du fichier
            $rowdatas_saveName = '';
            foreach( ric_import_datatourisme::$curlHeaders as $header) {
                if (preg_match('/filename="?(.*)"?/', $header, $matches)){
                    $rowdatas_saveName = str_replace('"','',$matches[1]);
                }
            }
            // Renommage
            rename($rowdatas_temp_file, $destination_dir . $rowdatas_saveName);
            $reponses[] = 'Le fichier a été renommé en '.$rowdatas_saveName;
        }
        curl_close($ch);
        fclose(ric_import_datatourisme::$GlobalFileHandle);

        // Décompression du fichier
        $reponses_zip = ric_import_datatourisme::unZip($destination_dir, $destination_dir . $rowdatas_saveName );
        $reponses = array_merge( $reponses, $reponses_zip );

        // Fin de traitement
        $reponses[] = 'Terminé, les données sont prêtes à être indexées';

        // Il faut indiquer à tous les autres traitements de reprendre leur travail
        update_option('ric_datatourisme_maj_datas_date', date('Y-m-d'));
        update_option('ric_datatourisme_maj_encours', false);
        update_option('ric_datatourisme_newdatas', true);

        // Log du travail effectué
        $reponses[] = date('Y-m-d H:i:s');
        ric_import_datatourisme::logReponses($reponses);

        return $reponses;

    }
    public static function curlWriteFile($cp, $data) {
        $len = fwrite(ric_import_datatourisme::$GlobalFileHandle, $data);
        return $len;
    }
    public static function captureHeader($ch, $headerData){
        if (substr($headerData, 0, 4) == 'HTTP'){
            ric_import_datatourisme::$curlStatus = substr($headerData, 9, 3);
        }
        else if (false !== strpos($headerData, ':')){
            list($header, $content) = explode(':', $headerData, 2);
            //Normalize the header name
            $header = ric_import_datatourisme::normalize($header);
            $content = trim($content);

            ric_import_datatourisme::$curlHeaders[$header] = $content;
        }
        return strlen($headerData);
    }
    public static function normalize($header){
        return ucfirst(strtolower(trim($header)));
    }

    public static function unZip( $content_dir, $filename ) {
        $reponses = array();
        if ( is_file( $filename ) ) {

            // Décompression
            $zip = new ZipArchive();
            if ( $zip->open($filename, ZipArchive::CREATE) !== TRUE ) {
                $reponses[] = "Impossible d'ouvrir le fichier ".$filename;
                return $reponses ;
            } else {
                $zip->extractTo($content_dir.'datas/');
                $zip->close();
                $reponses[] = "Fichier zip chargé et décompressé";
            }
            // Suppression du zip source
            unlink($filename);
            $reponses[] = "Fichier zip supprimé";
        } else {
            $reponses[] = "Aucun fichier zip à traiter";
        }

        return $reponses;
    }
    public static function logReponses($reponses) {
        // Log du travail effectué
        $log_dir = dirname(__FILE__)."/../../logs/"; // dossier où sont placés les fichiers de log
        $logfilename = date('Y-m-d') . '_logfile.txt';
        $logFile = fopen($log_dir . $logfilename, 'a+');

        fwrite( $logFile, '---------------------------------'  .chr(13).chr(10) );
        foreach ( $reponses as $reponse ) {
            fwrite( $logFile, $reponse  .chr(13).chr(10) );
        }
        fwrite( $logFile, '---------------------------------'  .chr(13).chr(10) );
        fclose( $logFile );

    }
}```

Il faudra adapter les fonctions wordpress update_option et get_option permettant de sauvegarder une variable en base de données.
En espérant que cela vous aide

Bonjour
j’utilise ce code
il télécharge le code et le dezippe en même temps. Pour les énormes fichiers ça aide pas mal

$filesToProcess=[

["url"=>"https://diffuseur.datatourisme.fr/webservice/etc/","name"=>"fichierlocal.json"],

] ;

if(empty($argv)) die(« argv »);
$disk=$argv[1];
echo « disk= ».$disk."\n";
$token=« letoken »;
foreach($filesToProcess as $file){
echo $file[« name »].$token."\n";
$local_fp = fopen($disk."/".$file[« name »], ‹ w ›);
$unzipped_content = ‹  ›;
$zd = gzopen($file[« url »].$token, « r »);
while ($zip_file = gzread($zd, 10000000)){
fwrite($local_fp, $zip_file);
}
gzclose($zd);
fclose($local_fp);
}