如何不保存到磁盘就将文件传给Google Drive API的MediaFileUpload
解决方案
你遇到的报错是因为使用的MediaFileUpload仅支持传入本地文件路径、本地文件对象,不支持Flask框架的FileStorage对象或原始字节流,尝试传入字节流时它会错误地尝试用UTF-8解码内容,因此触发编码报错。
无需落盘的实现方案
使用Google API客户端提供的MediaIoBaseUpload类替换MediaFileUpload,前者原生支持二进制类文件对象,可以直接对接Flask返回的FileStorage实例,全程在内存中处理,不需要写入磁盘。
代码实现步骤
- 导入对应依赖
from googleapiclient.http import MediaIoBaseUpload
- 修改上传逻辑,直接使用Flask获取的文件对象
# 从请求中获取上传文件 uploaded_file = request.files['file'] # 可选:如果之前有调用过read()操作,需要重置文件指针到开头 # uploaded_file.seek(0) file_metadata = { 'name': uploaded_file.filename, # 直接使用用户上传的原始文件名 'parents': [folder_id] } # 使用MediaIoBaseUpload接收类文件对象,自动处理二进制流 media = MediaIoBaseUpload( uploaded_file, mimetype=uploaded_file.mimetype, # 自动识别上传文件的MIME类型,无需硬编码 resumable=True ) file = service.files().create( body=file_metadata, media_body=media, fields='id' ).execute()
关键说明
- 全程没有磁盘IO操作,不会产生临时文件,也不需要后续的文件清理逻辑
- 直接读取二进制流,不会尝试解码文件内容,不会触发编码报错
- 自动适配不同类型的上传文件,不需要提前预判文件类型或编码
内容的提问来源于stack exchange,提问作者Myrto Pirli
相关产品推荐
相关产品推荐

