使用python将文件上传到特定的Google云端硬盘文件夹

时间:2016-03-02 10:16:00

标签: python google-drive-api

我创建了一个简单的网络应用,可以使用Auth2.0身份验证在Google云端硬盘中保存一些文件。当我使用下面的代码时,一切都运行良好,但我在这里遇到了一些困难。第一个是将内容保存在不同的指定文件夹中。下面的代码将文件保存在根文件夹中,我无法弄清楚原因。 upload_folder_id 显然具有良好的价值,我在这里省略了。

from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

SCOPES = 'https://www.googleapis.com/auth/drive.file'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store, flags) \
            if flags else tools.run(flow, store)

DRIVE = build('drive', 'v3', http=creds.authorize(Http()))

upload_folder_id = <my_folder_id>
FILES = (('hello.txt', None)) # More files will be added after

for filename, mimeType in FILES:
    metadata = {'name': filename}

    if mimeType:
        metadata['mimeType'] = mimeType
    ''' I tried all this possibilities too
        metadata['parentId'] = upload_folder_id
        metadata['folderId'] = upload_folder_id
    '''
    metadata['parents'] = [{'id': upload_folder_id}]

    res = DRIVE.files().create(body=metadata, media_body=filename).execute()
    if res:
        print('Uploaded "%s" (%s)' % (filename, res['mimeType']))

第二个是身份验证步骤。我第一次连接应用程序时,我被重定向到谷歌网页,我授予API访问权限。有没有办法在不通过Web浏览器验证访问权限的情况下执行此操作? (对我的本地测试来说这很好,但是我不能在生产服务器上这样做。)

1 个答案:

答案 0 :(得分:0)

下面的代码将文件保存在根文件夹中,我无法弄明白为什么.upload_folder_id显然具有良好的价值,我在这里省略了。

parents应该是一个字符串数组,所以id属性不需要存在;只需指定父文件夹ID,我认为你很高兴

有没有办法在不通过网络浏览器验证访问权限的情况下执行此操作?

同意页面对于用户的身份验证过程至关重要,我不认为抓取可以成为解决方案。我能想到的另一种选择是使用服务帐户,这是一种服务器到服务器的实现,因此用户无需登录。这里的缺点是用户不拥有数据,服务帐户也是如此。