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

如何通过Google API Client设置Google Drive上传文件的公开共享链接

问题分析

你的代码存在几个导致权限设置不生效的核心问题:

  1. Google Drive API v3 不支持在files().create请求的body中直接传入permissions参数,这个字段会被API忽略,必须单独调用permissions().create接口来配置权限。
  2. 仅在新建文件夹时尝试设置权限,但已存在的文件夹未执行权限配置操作。
  3. 上传后的文件默认保持私有状态,未同步设置公开可读权限。
修复后的完整代码
import os 
import os.path

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


class GoogleDriveHelper:
    def __init__(self, file_name):
        self.file_name = file_name
        self.scope = "https://www.googleapis.com/auth/drive"
        self.creds = None

    def authenticate(self):
        if os.path.exists("token.json"):
            self.creds = Credentials.from_authorized_user_file("token.json", self.scope)

        if not self.creds or not self.creds.valid:
            if self.creds and self.creds.expired and self.creds.refresh_token:
                self.creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    "credentials.json", self.scope
                )
                self.creds = flow.run_local_server()

            with open("token.json", "w") as token:
                token.write(self.creds.to_json())

    def set_public_permission(self, file_id):
        """给指定ID的文件/文件夹设置公开可读权限"""
        try:
            service = build("drive", "v3", credentials=self.creds)
            permission_body = {
                "type": "anyone",
                "role": "reader"
            }
            service.permissions().create(
                fileId=file_id,
                body=permission_body,
                fields="id"
            ).execute()
            print(f"已设置公开权限: {file_id}")
        except HttpError as error:
            print(f"设置权限失败: {str(error)}")

    def create_folder(self):
        try:
            service = build("drive", "v3", credentials=self.creds)

            response = service.files().list(
                q=f"name='{self.file_name}' and mimeType='application/vnd.google-apps.folder'",
                spaces="drive"
            ).execute()

            if not response["files"]:
                file_metadata = {
                    "name": f"{self.file_name}",
                    "mimeType": "application/vnd.google-apps.folder"
                }

                file = service.files().create(body=file_metadata, fields="id").execute()
                folder_id = file.get("id")
                print("已创建文件夹: " + folder_id)
                # 给新文件夹设置公开权限
                self.set_public_permission(folder_id)
            else:
                folder_id = response["files"][0]["id"]
                print("文件夹已存在,ID: " + folder_id)
                # 给已存在的文件夹设置公开权限
                self.set_public_permission(folder_id)

            # 获取文件夹的网页链接
            file = service.files().get(fileId=folder_id, fields="webViewLink").execute()
            folder_link = file.get("webViewLink")
            print("文件夹链接: " + folder_link)

            return folder_id, folder_link

        except HttpError as error:
            print(f"错误: {str(error)}")
            return None

    def upload_file(self, file_path, folder_id):
        try:
            service = build("drive", "v3", credentials=self.creds)

            file_metadata = {
                "name": os.path.basename(file_path),
                "parents": [folder_id]
            }

            media = MediaFileUpload(file_path)

            file = service.files().create(body=file_metadata, media_body=media, fields="id").execute()
            file_id = file.get("id")
            print("已上传文件: " + file_id)
            # 给上传的文件设置公开权限
            self.set_public_permission(file_id)

            return file_id

        except HttpError as error:
            print(f"错误: {str(error)}")
            return None
关键修改说明
  • 新增set_public_permission方法,封装权限配置逻辑,通过官方指定的permissions().create接口完成公开权限设置。
  • 删除原file_metadata中无效的permissions字段,避免API忽略导致的无效操作。
  • 在文件夹新建、文件夹已存在、文件上传完成三个场景下,统一调用权限设置方法,确保所有需要公开的资源都配置正确权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:50:06