首页 > 解决方案 > 无法重命名服务器上的文件,然后通过服务帐户上传到谷歌驱动 API

问题描述

我现在已经阅读了几篇文章/文档/问题,每一篇都解决了我的问题的一部分,但我似乎无法将它们全部放在一起工作。我正在使用 Flask/Python、Google Drive API v3 和一个服务帐户,但想在已经设置好的 Heroku 上运行该站点。由于 Heroku 没有文件存储空间,我需要直接将文件上传到 Google Drive,这迟早需要完成。

基本上我想做的是:

我能够用 utf-8 字符重命名文件并将其保存在本地,但不知道如何将其上传到 Google。我之前尝试过一种方法,但我不知道是只创建了一个没有内容的文件还是文件已正确上传,我在列出文件/文件夹时确实看到了文件和文件夹(现在不起作用不过,我认为我现在的尝试是完全一样的)。

我的代码:

def upload_service(file, filename):

file_metadata = {
        'name': filename,
        'parents': 'Upload'
}

mime = mimetypes.guess_type(file.filename)[0]
media = MediaFileUpload(filename, mimetype=mime)

cloudFile = service.files().create(body=file_metadata, media_body=media).execute()

result = service.files().list().execute()

在这里,file上传的实际文件filename是用户输入的输入。一切正常,但media = MediaFileUpload(filename, mimetype=mime)我收到一个FileNotFoundError: [Errno 2] No such file or directory: 'gtmuCfr.jpg'错误,指出名称为filenameor的文件file不存在。这适用于文件的原始名称和新名称。

标签: pythonflaskfile-uploadgoogle-drive-apigoogle-api-python-client

解决方案


好的,我终于找到了问题并且能够修复它(大部分)。

with open(new_name.encode("utf-8"), "wb") as save_file:
            file = save_file.write(f.read())
            upload_service(file, new_name)

这样做可以解决问题,就像file它存储的 int 一样(我猜),但由于它没有filename属性,我需要使用path/new_name函数内部。
函数内部的唯一区别是:

file_metadata = {
        'name': path,
        'parents': 'Upload'
}

mime = mimetypes.guess_type(path)[0]
media = MediaFileUpload(path, mimetype=mime)

我需要使用path/new_name我发送的作为第二个参数的地方。现在剩下的唯一问题是未选择上传文件夹/父文件夹进行上传,但我可以在我的云端硬盘中看到文件(授予权限后),并且它们具有正确的内容。


推荐阅读