我们有一个网站,前端是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()
此代码适用于uploaded_file是磁盘上的路径的情况。然而,我想上传文件到谷歌,而不必先将其保存到磁盘(因为它将占用空间,我们将不得不删除它)。我尝试直接传递文件,因为我从Flask请求对象中获得了它。
uploaded_file = request.files['file']
然后我得到消息"expected str,bytes or os.PathLike object,not str“。我试过了
uploaded_file = request.files['file'].read()
来获取以字节为单位的文件。然后我得到消息"'utf-8‘编解码器无法解码0xd0位置的字节:无效的继续字节“。据我所知,这意味着编码不是'utf-8‘,而是其他编码,但我们不能事先知道用户上传的文件将采用什么编码,我也找不到找到它的方法。除了将文件保存到磁盘并在上传到Google drive后明确删除之外,还有什么建议吗?
发布于 2021-11-18 13:45:28
您可以使用googleapiclient.http
中的MediaIoBaseUpload
from googleapiclient.http import MediaIoBaseUpload
import io
f = io.BytesIO(b'mybytestring')
MediaIoBaseUpload(f, mimetype='application/msword')
发布于 2021-11-18 13:47:05
您可以使用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)
https://stackoverflow.com/questions/70020831
复制相似问题