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

