【问题标题】:How to pass file to Google Drive API (MediaFileUpload) without saving it to the disk如何将文件传递到 Google Drive API(MediaFileUpload)而不将其保存到磁盘
【发布时间】:2021-12-29 09:37:26
【问题描述】:

我们有一个网站,前端是 React,后端是 python。我正在尝试创建一个 python 后端(使用 Flask),用户在其中上传文件,python 将其上传到 Google Drive。我找到了通过 API 将文件上传到 Google Drive 的代码:

file_metadata = {
    'name': filename,
    'parents': [folder_id]
}
media = MediaFileUpload(uploaded_file,
                        mimetype='application/msword',
                        resumable=True)
file = service.files().create(body=file_metadata,
                              media_body=media,
                              fields='id').execute()

此代码适用于 upload_file 是磁盘上的路径。但是,我想将文件上传到 Google,而不必先将其保存到磁盘(因为它会占用空间,之后我们必须将其删除)。我尝试在从 Flask 请求对象获取文件时直接传递文件。

uploaded_file = request.files['file']

然后我收到消息“预期的 str、字节或 os.PathLike 对象,而不是 FileStorage”。我试过了

uploaded_file = request.files['file'].read()

以字节为单位获取文件。然后我收到消息“'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte”。根据我的阅读,这意味着编码不是“utf-8”而是其他编码,但我们无法事先知道用户将上传的文件将采用什么编码,我也找不到找到它的方法。除了将文件保存到磁盘并在上传到 Google 驱动器后明确删除之外,还有什么建议?

【问题讨论】:

    标签: python google-drive-api


    【解决方案1】:

    您可以使用io 缓冲区来保存上传的文件,而无需将其写入磁盘。请参阅下面的示例。

    import io
    uploaded_file: FileStorage = request.files['file']
    buffer = io.BytesIO()
    buffer.name = uploaded_file.filename
    uploaded_file.save(buffer)
    media = MediaFileUpload(buffer,
                            mimetype='application/msword',
                            resumable=True)
    

    【讨论】:

    • 这不起作用,因为 MediaFileUpload 不接受 io.BytesIO。按照下面的建议使用了 MediaIoBaseUpload,效果很好。
    【解决方案2】:

    你猫用MediaIoBaseUpload来自googleapiclient.http

    from googleapiclient.http import MediaIoBaseUpload
    import io
    
    
    f = io.BytesIO(b'mybytestring')
    MediaIoBaseUpload(f, mimetype='application/msword')
    

    【讨论】:

    • MediaIoBaseUpload 成功了!
    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多