Скачивание zip-файлов с Google Drive с помощью SDK для PHP - PullRequest
0 голосов
/ 25 сентября 2018

Я загрузил резервную копию своего сайта на диск Google с помощью Drive SDK для PHP "google/apiclient": "^2.0" она отлично работает с точки зрения загрузки, сейчас я пытаюсь загрузить файлы с резервной копией с диска, используя тот же SDK, но проблема заключается вна некоторых серверах он работает идеально, а на других серверах он дает мне Header already sent issue.Я делаю это плагином для WordPress, и использование заголовка для загрузки этих файлов - не очень хорошая идея, я знаю это, но что должно быть альтернативой.Код, через который я загружаю эти файлы, выглядит следующим образом.

$tempID = Helper::getBackupById($backupID);
    $AT = Helper::get_Settings('google_token');
    $refreshToken = Helper::get_Settings('google_refresh_token');

    $client = new Google_Client();
    $client->setClientId('CLIENT ID');
    $client->setClientSecret('CLIENT_SECRET');
    $client->setScopes(array('https://www.googleapis.com/auth/drive'));

    $client->setAccessToken($AT);

    if ($client->isAccessTokenExpired()) {
        $request = $client->refreshToken($refreshToken);
        $newAT = $request['access_token'];
        $newRefreshToken = $request['refresh_token'];
        Helper::save_or_update_settings('google_token', $newAT);
        Helper::save_or_update_settings('google_refresh_token', $newRefreshToken);
        $client->setAccessToken($newAT);
    }

    $service = new Google_Service_Drive($client);

    $google_keys = unserialize($tempID[0]->google_keys);
    $parentId = $google_keys['g_folder'];
    $lists = $service->files->listFiles(array('q' => "'$parentId' in parents"));

    foreach ($lists as $list) {
        if (!is_dir(wp_upload_dir()['basedir'] . '/Restore')) {
            @mkdir(wp_upload_dir()['basedir'] . '/Restore', 0777);
        }
        $storeIn = wp_upload_dir()['basedir'] . '/Restore/' . $list->name . '.zip';

        $content = $service->files->get($list->id, array('alt' => 'media'));

        $headers = $content->getHeaders();
        foreach ($headers as $name => $values) {
            header($name . ': ' . implode(', ', $values));
        }
        header('Content-Disposition: attachment; filename="' . $tempID[0]->file . '"');
        $body = $content->getBody();

        while (!$body->eof()) {
            file_put_contents($storeIn, $body);
        }

        echo "Done.\n";
    }

Теперь мой вопрос заключается в том, существует ли какой-либо другой способ загрузки этих файлов без использования какого-либо заголовка.Если да, намек очень поможет.

1 Ответ

0 голосов
/ 25 сентября 2018

Я только что попробовал что-то, и это сработало отлично, часть заголовка в этом коде была бесполезна. Я просто удалил этот код, и он работал нормально только для кого-то, если он понадобится в будущем, вот обновленный код.

$tempID = Helper::getBackupById($backupID);
$AT = Helper::get_Settings('google_token');
$refreshToken = Helper::get_Settings('google_refresh_token');

$client = new Google_Client();
$client->setClientId('CLIENT ID');
$client->setClientSecret('CLIENT_SECRET');
$client->setScopes(array('https://www.googleapis.com/auth/drive'));

$client->setAccessToken($AT);

if ($client->isAccessTokenExpired()) {
    $request = $client->refreshToken($refreshToken);
    $newAT = $request['access_token'];
    $newRefreshToken = $request['refresh_token'];
    Helper::save_or_update_settings('google_token', $newAT);
    Helper::save_or_update_settings('google_refresh_token', $newRefreshToken);
    $client->setAccessToken($newAT);
}

$service = new Google_Service_Drive($client);

$google_keys = unserialize($tempID[0]->google_keys);
$parentId = $google_keys['g_folder'];
$lists = $service->files->listFiles(array('q' => "'$parentId' in parents"));

foreach ($lists as $list) {
    if (!is_dir(wp_upload_dir()['basedir'] . '/Restore')) {
        @mkdir(wp_upload_dir()['basedir'] . '/Restore', 0777);
    }
    $storeIn = wp_upload_dir()['basedir'] . '/Restore/' . $list->name . '.zip';

    $content = $service->files->get($list->id, array('alt' => 'media'));

    $body = $content->getBody();

    while (!$body->eof()) {
        file_put_contents($storeIn, $body);
    }

    echo "Done.\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...