猿问

Google Drive API 下载 jpg

我正在尝试使用 php 将 google drive jpg 下载到服务器,以便将其保存为可用的 jpg,例如手动下载时。


我可以从 filemeta 获取 getWebContentLink 并保存扩展名为 .jpg 的“a”文件:


$filemeta = $this->service->files->get($id,[

    "fields"=>"*"

]);

$filename = public_path().'/test.jpg';

$url=$filemeta->getWebContentLink();

file_put_contents($filename, fopen($url, 'r'));

然而,这不是真正的 jpg,确实无法使用<img src="/test.jpg" />元素显示。


设置:


public function __construct() {

        $this->getClient();

        $this->service= new Google_Service_Drive($this->client);

    }


    /**

     * @return Google_Client

     * @throws \Google_Exception

     */

    protected function getClient() {

        $client = new Google_Client();

        $client->setApplicationName('Google Drive API PHP Quickstart');

        //20200521$client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY);

       $client->setScopes(Google_Service_Drive::DRIVE_READONLY);



       // https://www.googleapis.com/auth/drive.readonly

        $client->setAuthConfig(base_path().'/apicredentials/google/credentials.json');

        $client->setAccessType('offline');

        $client->setPrompt('select_account consent');


        // Load previously authorized token from a file, if it exists.

        // The file token.json stores the user's access and refresh tokens, and is

        // created automatically when the authorization flow completes for the first

        // time.

        $tokenPath = base_path().'/apicredentials/google/token.json';

        if (file_exists($tokenPath)) {

            $accessToken = json_decode(file_get_contents($tokenPath), true);

            $client->setAccessToken($accessToken);

        }


        // If there is no previous token or it's expired.

        if ($client->isAccessTokenExpired()) {

            // Refresh the token if possible, else fetch a new one.

            if ($client->getRefreshToken()) {

                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());

            } 

                }

            }



慕码人2483693
浏览 88回答 1
1回答

叮当猫咪

这个答案怎么样?问题和解决方法:为了webContentLink从外部检索文件内容,需要使用访问令牌或文件需要公开共享。所以在你的脚本中,我认为创建的文件是登录页面的 HTML 数据。那么以下解决方法如何?webContentLink使用访问令牌下载文件内容。首先,在 Google Drive 上公开共享该文件。然后,使用您当前的脚本下载文件内容。使用 Drive API 直接下载文件内容。在这种情况下,修改后的脚本如下。如果您使用https://www.googleapis.com/auth/drive.metadata.readonlyas 范围,请修改为https://www.googleapis.com/auth/drive.readonly.$content = $this->service->files->get($id, array("alt" => "media"));$filename = public_path().'/test.jpg';file_put_contents($filename, $content->getBody());
随时随地看视频慕课网APP
我要回答