python - 无法重命名服务器上的文件,然后通过服务帐户上传到谷歌驱动 API
问题描述
我现在已经阅读了几篇文章/文档/问题,每一篇都解决了我的问题的一部分,但我似乎无法将它们全部放在一起工作。我正在使用 Flask/Python、Google Drive API v3 和一个服务帐户,但想在已经设置好的 Heroku 上运行该站点。由于 Heroku 没有文件存储空间,我需要直接将文件上传到 Google Drive,这迟早需要完成。
基本上我想做的是:
- 人们在网站上输入他们的数据并上传文件。
- 然后根据用户的数据对该文件进行重命名(需要支持汉字/utf8)
- 然后使用服务帐户将重命名的文件上传到 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'
错误,指出名称为filename
or的文件file
不存在。这适用于文件的原始名称和新名称。
解决方案
好的,我终于找到了问题并且能够修复它(大部分)。
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
我发送的作为第二个参数的地方。现在剩下的唯一问题是未选择上传文件夹/父文件夹进行上传,但我可以在我的云端硬盘中看到文件(授予权限后),并且它们具有正确的内容。
推荐阅读
- python - 提取熊猫中的不连续行集
- java - 获取基于月份的日期的上周日期范围
- python-3.x - 使用 Python 脚本加载 Redshift 数据
- python - ValueError:在python中为数组设置初始条件时使用序列设置数组元素
- ejs - 在自定义 HttpExceptionFilter 中渲染页面
- postgresql - postgres_fdw 扩展性能低下
- .net - 如何添加自定义导出器以从 opentelemetry 捕获跟踪?
- javascript - 错误类型错误:无法设置未定义 ANGULAR 的属性“名称”
- three.js - THREE.js 中的 ParametricBufferGeometry
- android - 如果在后台使用位置,更新到 Android 11 是否需要应用显示另一个位置权限对话框?