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

使用Google Drive API更新文件:PHP代码报错求助

问题解决:Google Drive文件更新时的「不可写入字段」错误

错误原因

你触发的The resource body includes fields which are not directly writable.错误,是因为更新文件时,不必要地给Google_Service_Drive_DriveFile对象设置了不可直接修改的Id字段,重复设置文件名也是多余操作——当仅需更新文件内容、保留原文件属性时,完全不需要构造包含这些字段的对象。

修正后的核心代码

将原代码中更新文件的部分替换为以下内容:

if ($existingFile) {
    // 更新现有文件内容
    $file_path = $_FILES['archivos']['tmp_name'];
    $content = file_get_contents($file_path);

    // 无需构造带Id或Name的DriveFile对象,直接传null即可
    $service->files->update(
        $existingFile->getId(),
        null, // 仅更新媒体内容时,传空对象或null即可
        array(
            'data' => $content,
            'mimeType' => $existingFile->getMimeType(),
            'uploadType' => 'media'
        )
    );

    echo "Archivo actualizado: <a href='https://drive.google.com/open?id=" . $existingFile->getId() . "' target='_blank'>$nombre</a>";
}

额外优化建议

  • 避免同名文件误更新:原代码仅通过文件名查找文件存在风险,若Drive内有多个同名文件,只会更新第一个匹配项。建议在查询条件中加入目标文件夹ID过滤:
    $folderId = "1wCtnAxZE3sG6sHtqbZJ45njIAtPW6NZb"; // 对应上传时的文件夹ID
    $results = $service->files->listFiles(array(
        'q' => "name='$nombre' and '$folderId' in parents"
    ));
    
  • 优化大文件上传:直接传入文件流而非读取整个文件到内存,提升大文件处理效率:
    $content = fopen($file_path, 'rb');
    // 后续update方法的data参数传入$content即可
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:35:04