PHP调用Google Drive API可恢复上传时类型不匹配报错求助
问题解决:可恢复上传时"Expected type 'Psr\Http\Message\RequestInterface'. Found 'Google\Service\Drive\DriveFile'"错误
错误原因
当设置$client->setDefer(true)后,若在$driveService->files->create()中传入'data'参数,会导致返回结果不是预期的请求对象(RequestInterface),而是直接返回DriveFile实例,与MediaFileUpload要求的参数类型不匹配,从而触发报错。可恢复上传的初始化请求无需提前传入文件内容,需先发起初始化请求,再通过MediaFileUpload处理分块上传流程。
修正步骤及代码
- 移除
files->create()中的'data'参数,仅保留文件元数据和uploadType = 'resumable'配置。 - 确保
$request是defer模式下返回的合法请求对象。 - 补充分块上传的核心逻辑,实现文件的逐块读取与上传。
修正后的完整代码:
$client = new \Google\Client(); $client->setAuthConfig('credentials.json'); $client->addScope(\Google\Service\Drive::DRIVE_FILE); // 确保配置正确的权限范围 $driveService = new Google\Service\Drive($client); $file = new Google\Service\Drive\DriveFile(); $file->setName($filename); $chunkSizeBytes = 100 * 1024 * 1024; // 设置100MB的分块大小 $client->setDefer(true); // 发起可恢复上传的初始化请求,不传入文件内容 $request = $driveService->files->create( $file, [ 'uploadType' => 'resumable' ] ); // 初始化MediaFileUpload实例 $media = new Google\Http\MediaFileUpload( $client, $request, 'text/csv', null, true, $chunkSizeBytes ); // 打开文件准备分块读取 $handle = fopen($filepath, 'rb'); // 逐块上传文件内容 while (!feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $status = $media->nextChunk($chunk); } fclose($handle); // 关闭defer模式,恢复正常API调用逻辑 $client->setDefer(false); // 输出上传完成后的文件信息 if ($status !== false) { print_r($status); }
关键说明
- 权限配置:必须添加
DRIVE_FILE或对应权限范围,避免上传时出现权限不足的错误。 - defer模式作用:
setDefer(true)会让API调用返回请求对象而非直接执行请求,这是实现可恢复上传的必要前提。 - 分块读取优势:使用
fread逐块读取文件,避免大文件一次性加载到内存,提升上传性能与稳定性。
内容的提问来源于stack exchange,提问作者dev vikas
相关产品推荐
相关产品推荐

