You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP调用Google Drive API上传图片无报错但失败问题求助

问题:Google Drive PHP API上传图片无报错但未成功上传

我在网站中使用Google API向指定文件夹上传图片,发现Google官方仅提供Python、JS等语言的API使用文档,没有PHP版本的官方指引。当前遇到的问题是:代码执行无任何报错,但图片并未成功上传,我可以100%确认服务账号配置正常。

以下是我的PHP上传代码:

<?php
include '../vendor/autoload.php';

function handleGoogleDrive($file)
{
    //connecting to google drive
    $client = new \Google_Client();
    $client->setApplicationName('Somesite');
    $client->setScopes([\Google_Service_Drive::DRIVE]);
    $client->setAccessType('offline');
    $client->setAuthConfig('./credentials.json');
    $client->setClientId('2445617429-6k99ikago0s0jdh5q5k3o37de6lqtsd3.apps.googleusercontent.com');
    $client->setClientSecret('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');
    $service = new Google_Service_Drive($client);
    //counting amount of files in folder, there is no real reason in doing that
    //it is just a test of connecting
    $folder_id = '1eQtNOJjlA2CalZYb90bEs34IaP6v9ZHM';
    $options = [
        'q' => "'" . $folder_id . "' in parents",
        'fields' => 'files(id, name)'
    ];
    //printing result
    $results = $service->files->listFiles($options);
    echo count($results->getFiles());
    //trying to add file
    $data = file_get_contents("../test.jpg");
    $file = new Google_Service_Drive_DriveFile();
    $file->setName(uniqid(). '.jpg');
    $file->setDescription('A test document');
    $file->setMimeType('image/jpeg');
    $new_file = $service->files->create($file, [
        'data' => $data,
        'mimeType' => 'image/jpeg',
        'uploadType' => 'multipart',
    ]);
    print_r($new_file);
}

问题排查与解决方案

1. 核心问题:未指定目标文件夹

你的代码没有给上传的文件设置父文件夹ID,导致文件默认上传到服务账号自身的Drive存储空间,而非你指定的1eQtNOJjlA2CalZYb90bEs34IaP6v9ZHM文件夹。需要给Google_Service_Drive_DriveFile对象添加父文件夹配置:

$file = new Google_Service_Drive_DriveFile();
$file->setName(uniqid(). '.jpg');
$file->setDescription('A test document');
$file->setMimeType('image/jpeg');
// 新增:指定文件上传到目标文件夹
$file->setParents([$folder_id]);

2. 冗余配置与异常捕获优化

  • setAuthConfig会自动从credentials.json读取ClientId和ClientSecret,无需重复调用setClientId和setClientSecret,避免配置冲突。
  • 增加文件读取校验,确保file_get_contents成功获取图片内容。
  • 添加try-catch块捕获上传过程中的潜在异常,方便排查问题。

修正后的完整代码

<?php
include '../vendor/autoload.php';

function handleGoogleDrive($file)
{
    $client = new \Google_Client();
    $client->setApplicationName('Somesite');
    $client->setScopes([\Google_Service_Drive::DRIVE]);
    $client->setAccessType('offline');
    $client->setAuthConfig('./credentials.json');
    $service = new Google_Service_Drive($client);

    $folder_id = '1eQtNOJjlA2CalZYb90bEs34IaP6v9ZHM';
    // 测试连接:统计目标文件夹文件数量
    $options = [
        'q' => "'" . $folder_id . "' in parents",
        'fields' => 'files(id, name)'
    ];
    $results = $service->files->listFiles($options);
    echo "目标文件夹文件数:" . count($results->getFiles()) . "<br>";

    // 读取图片并校验
    $data = file_get_contents("../test.jpg");
    if (!$data) {
        die("无法读取测试图片");
    }

    // 配置Drive文件参数
    $driveFile = new Google_Service_Drive_DriveFile();
    $driveFile->setName(uniqid() . '.jpg');
    $driveFile->setDescription('A test document');
    $driveFile->setMimeType('image/jpeg');
    $driveFile->setParents([$folder_id]);

    // 执行上传并捕获异常
    try {
        $new_file = $service->files->create($driveFile, [
            'data' => $data,
            'uploadType' => 'multipart',
        ]);
        echo "上传成功,文件ID:" . $new_file->getId();
    } catch (Exception $e) {
        echo "上传失败:" . $e->getMessage();
    }
}

// 调用上传函数
handleGoogleDrive(null);
?>

额外检查项

确保服务账号已被添加到目标文件夹的共享列表中,并赋予编辑权限——即使服务账号配置正常,无文件夹权限也无法完成上传。

内容的提问来源于stack exchange,提问作者user19324146

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:55:16