【发布时间】: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 实现。