【问题标题】:Impossible to upload pdf on Gdrive subfolders with Python using service account使用服务帐户无法使用 Python 在 Gdrive 子文件夹上上传 pdf
【发布时间】:2018-01-30 17:34:33
【问题描述】:

我创建了一个烧瓶项目,将 pdf 存储在谷歌驱动器上。用户只需将 pdf 拖到 DIV 上,flask 就会使用服务帐户将文件上传到 Drive。上传工作正常,但文件上传到根文件夹而不是子文件夹。服务帐户创建一个委托对象以进入 gdrive,具有文件和文件夹所有者的凭据,但无法将文件上传到任何子文件夹,也无法读取文件夹的内容。

服务帐户是否需要任何特定权限才能读取和写入子文件夹?

问候,法比奥

def gauth(id_dipartimento):
   d={}
   json_url = os.environ['SERVICE-ACCOUNT.json']
   scopes = ['https://www.googleapis.com/auth/drive.file']
   credentials = erviceAccountCredentials.from_json_keyfile_name(json_url, scopes=scopes)
## The service account creates ua delegated object with current user credentals
delegated_credentials = credentials.create_delegated(<CURRENT_USER>)
http_auth = delegated_credentials.authorize(httplib2.Http())
return http_auth 

def upload_file():
    http_auth = gauth()
    drive_service = discovery.build('drive', 'v3', http=http_auth)

    folder_id = <folder_id_here>


    body = {
        'name': filename,
        'mimeType': mime_type,
        'useDomainAdminAccess':True,
        'parents':folder_id
    }

    media = MediaFileUpload(filepath,
                            mimetype=mime_type,
                            resumable=True)

    file = drive_service.files().create(body=body,
                                        media_body=media,
                                        fields='id,originalFilename').execute()

    new_permission = {
      'type': "anyone",
      'role': "reader",
    }

    try:
        drive_service.permissions().create(fileId=file["id"], body=new_permission).execute()
    except errors.HttpError, error:
        print 'An error occurred: %s' % error

【问题讨论】:

  • IIRC 权限默认不授予子目录。如果您无法在文档中找到,请寻找一种方法来列出父目录中的所有目录。如果需要特定授权,我认为 API 甚至无法看到其他目录存在,因此您可能会得到一个空列表。这将证实这一点。
  • 谢谢 roganjosh,此时有什么解决方法?我是否要在根目录中创建一个 Google 脚本,将文件移动到子文件夹中?
  • 首先,我对这个问题的回忆是否正确?我从未直接使用过 API,只使用过包装器库,并且在这些(gspread 等)中没有我知道的解决方法 - 您需要明确授予每个目录的权限。我不确定原始 API。
  • 当我使用google API在根目录上传文件时,它可以被列出,但是如果我将pdf从子文件夹移动到根目录,它根本无法列出,系统返回“404 not found错误”。为什么会有这种差异?肯定是权限问题,我可以更改或设置哪个权限?
  • 还没有亲自尝试过。上传成功后尝试move the files between folders。此方法受支持并具有 Python 实现。

标签: python google-drive-api


【解决方案1】:

解决了一个问题,我只需登录到管理控制台并按照service account page“将域范围的权限委派给服务帐户”中描述的说明进行操作。

然后我根据页面About authorization选择范围

当我尝试将文件加载到子文件夹时仍有问题,文件进入根文件夹

【讨论】:

    【解决方案2】:

    好的,我也了解如何将文件加载到子文件夹中。 “父母”元数据属性采用文件夹列表,这意味着文件将同时上传到列表的所有文件夹中。

    这些文件使用相同的 ID 创建,因此当我运行 drive_service.files().delete(fileId=id_file).execute() 时,该文件将从它上传到的每个文件夹中删除。

    在另一个线程中,我读到有必要提供“kind”属性,类似这样:

    [{"id": "XXXXXXXXXXXXXXXXXXX","kind": "drive#file"},{"id":"YYYYYYYYYYYYYYYYY","kind": "drive#file"}]

    但这对我不起作用,但可能是我误解了。需要一个带有文件夹 ID 的简单列表对象,如下所示。

    folder_id = [folder1, folder2, folder3]
    
    
    body = {
        'name': filename,
        'mimeType': mime_type,
        'useDomainAdminAccess':True,
        'parents':folder_id
    }
    

    希望这对第一次使用 Google Drive API 的人有所帮助。

    法比奥

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多