web-dev-qa-db-fra.com

wp_remote_get (), téléchargement et sauvegarde de fichiers

D'après ce que je peux voir, wp_remote_get () enregistre le contenu du fichier distant en mémoire.

Les fichiers que je dois télécharger sont compressés au format Zip ou GZIP et contiennent un fichier CVS ou XMl.

Ce que je dois faire en premier est de télécharger le fichier distant sur le disque dur au format Zip ou GZIP, puis de le décompresser.

Est-il possible d'utiliser wp_remote_get () pour télécharger le fichier entier et l'enregistrer dans un répertoire?

Une solution autre que Wordpress que j’avais utilisée auparavant était cURL:

public function grab_file($url, $new_file) {

    //get file
    $ch = curl_init();
    $fp = fopen(DIR_PATH."Zip/$new_file", "w");

    $options = array(CURLOPT_URL => $url, CURLOPT_HEADER => 0, CURLOPT_FAILONERROR =>
        1, CURLOPT_AUTOREFERER => 1, CURLOPT_BINARYTRANSFER => 1, CURLOPT_RETURNTRANSFER =>
        1, CURLOPT_FOLLOWLOCATION => 1, CURLOPT_TIMEOUT => 5, CURLOPT_FILE => $fp);

    curl_setopt_array($ch, $options);
    $file = curl_exec($ch);
    curl_close($ch);
    fclose($fp);

    if (!$file) {
        //$error = "cURL error number:" . curl_errno($ch);
        //$error .= "cURL error:" . curl_error($ch);
        return false;

    } else {

        return true;

    }
}
5
AndyW

Eh bien voici la solution que je suis venu avec:

// Use wp_remote_get to fetch the data
$response = wp_remote_get($url);

// Save the body part to a variable
$Zip = $data['body'];

// In the header info is the name of the XML or CVS file. I used preg_match to find it
preg_match("/.datafeed_([0-9]*)\../", $response['headers']['content-disposition'], $match);

// Create the name of the file and the declare the directory and path
$file = DIR_PATH."Zip/"."datafeed_".$match[1].".Zip";

// Now use the standard PHP file functions
$fp = fopen($file, "w");
fwrite($fp, $Zip);
fclose($fp);

// to unzip the file use the Wordpress unzip_file() function
// You MUST declare WP_Filesystem() first
WP_Filesystem();
if (unzip_file($file, DIR_PATH."feeds")) {
// Now that the Zip file has been used, destroy it
unlink($file);
return true;
} else {
return false;
}

Traiter avec un fichier GZIP était un peu différent:

// It is necessary to use the raw URL and find the extension of the encluse XML or CVS file first
private function save_ungzip($data, $url, $ext) {

// As with Zip, save the body of wp_remote_get() to memory
$gzip = $data['body'];

// As with Zip, look for the name of the file in the header
preg_match("/.datafeed_([0-9]*)\../", $data['headers']['content-disposition'], $match);
$file = DIR_PATH."feeds/"."datafeed_".$match[1].".$ext";

// now you need to use both the PHP gzip functions and the PHP file functions
$remote = gzopen($url, "rb");
$home = fopen($file, "w");

while ($string = gzread($remote, 4096)) {
    fwrite($home, $string, strlen($string));
}

gzclose($remote);
fclose($home);

}

Donc en conclusion. Lorsque vous utilisez wp_remote_get () pour récupérer un fichier distant, utilisez les fonctions de fichier intégrées PHP pour le sauvegarder à l'emplacement souhaité. Si vous avez une solution qui utilise les fonctions Wordpress, alors publiez-la.

8
AndyW