web-dev-qa-db-ja.com

wp_remote_get()、ファイルのダウンロードと保存

私が見ることができるものからwp_remote_get()はリモートファイルの内容をメモリに保存します。

私がダウンロードする必要があるファイルはZipかGZIPのどちらかに圧縮されており、その中にはCVSかXMlファイルがあるでしょう。

私が最初にする必要があるのはZipまたはGZIPとしてハードドライブにリモートファイルをダウンロードしてそしてそれらを解凍することです

Wp_remote_get()を使用してファイル全体をダウンロードしてそれをディレクトリーに保存することは可能ですか?

私が以前に使用したWordpress以外のソリューションは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

これが私が思いついた解決策です。

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

GZIPファイルを扱うことは少し異なっていました:

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

}

結論として。 wp_remote_get()を使用してリモートファイルを取得するときは、組み込みのPHPファイル関数を使用して目的の場所に保存します。あなたがWordpressの機能を利用する解決策を持っているならば、それを投稿してください。

8
AndyW