使用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
相关产品推荐
相关产品推荐

