【问题标题】:create new folder in google drive with rest api使用rest api在谷歌驱动器中创建新文件夹
【发布时间】:2019-01-14 05:35:51
【问题描述】:

只有当它不存在时,如何使用 python 在谷歌驱动器中创建一个新文件夹? 我对这个 google API 和 python 完全陌生。

(我的帐户有一个访问令牌,我想使用它创建文件夹。)

创建文件夹

import json
import requests
headers = {"Authorization": "Bearer Token"}

data = {
    "name": "name",
    "mimeType": "application/vnd.google-apps.folder"
}

r = requests.post("https://www.googleapis.com/drive/v3/files",
    headers=headers,data = data)
print(r.text)

只创建文件,而不是文件夹。我该如何解决这个问题?

【问题讨论】:

    标签: python google-api google-drive-api google-python-api


    【解决方案1】:
    
    
        def get_folder_id(self, folder, parent):
            _r = None
            try:
                url = 'https://www.googleapis.com/drive/v3/files?q={0}'. \
                    format(quote(
                        "mimeType='application/vnd.google-apps.folder'"
                        " and name ='{0}'"
                        " and trashed != true"
                        " and '{1}' in parents".format(folder, parent),
                        safe='~()*!.\''
                        )
                    )
                _r = requests.get(url, headers={
                    "Authorization": "Bearer {0}".format(self.get_access_token()),
                    "Content-Type": self.file_bean.get_content_type(),
                })
                _r.raise_for_status()
                _dict = _r.json()
                if 'files' in _dict and len(_dict['files']):
                    return _dict['files'][0]['id']
                else:
                    _f = self.create_folder(folder, parent)
                    if _f:
                        return _f
                    status, status_message = self.get_invalid_folder()
            except requests.exceptions.HTTPError:
                status, status_message = self.get_http_error(_r)
            except Exception as e:
                logger.exception(e)
                status, status_message = self.get_unknown_error()
    
    
        def create_folder(self, folder_name, parent_folder_id):
            url = 'https://www.googleapis.com/drive/v3/files'
            headers = {
                'Authorization': 'Bearer {}'.format(self.get_access_token()), # get your access token
                'Content-Type': 'application/json'
            }
            metadata = {
                'name': folder_name, #folder_name as a string
                'parents': [parent_folder_id], # parent folder id (="root" if you want to create a folder in root)
                'mimeType': 'application/vnd.google-apps.folder'
            }
            response = requests.post(url, headers=headers, data=json.dumps(metadata))
            response = response.json()
            if 'error' not in response:
                return response['id']  # finally return folder id
    

    使用 get_folder_id 如果不存在则在内部创建一个文件夹。

    PS:这段代码是从我的作品中盲目抄袭的,如果你理解有困难,我可以详细解答。

    【讨论】:

    • 感谢发帖。请注意,您的代码有一个错误。它需要在 files.list 的返回字段中包含 nextPageToken 并在它不为 null 时进行迭代。
    • 谢谢我错过了'Content-Type': 'application/json' - 该文件将被创建但不在父文件夹中并且没有名称
    【解决方案2】:

    您的第一步是定义“仅当它不存在时”的含义。在 Google 云端硬盘中,文件(而文件夹只是具有特殊 mime 类型的文件)由其 ID 标识,而不是由其名称标识。所以我可以有很多文件夹,都同名。

    我假设“仅当它不存在时”实际上意味着“仅当具有给定名称的文件夹尚不存在时”。步骤是:-

    1. 使用查询name=foldername, trashed=false, mime-type=application/vnd.google-apps.folder 执行文件/列表。确保您的 files.list 正确处理 nextPageToken
    2. If the count of results == 0, files.create foldername

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      相关资源
      最近更新 更多