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

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处理分块上传流程。

修正步骤及代码

  1. 移除files->create()中的'data'参数,仅保留文件元数据和uploadType = 'resumable'配置。
  2. 确保$request是defer模式下返回的合法请求对象。
  3. 补充分块上传的核心逻辑,实现文件的逐块读取与上传。

修正后的完整代码:

$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:35:01