繁体   English   中英

使用 pydrive 将图像字符串上传到 Google Drive

[英]Uploading image string to Google Drive using pydrive

我需要使用 PyDrive package 将图像字符串(作为您从requests.get(url).content获得的字符串)上传到谷歌驱动器。 我检查了一个类似的问题,但接受的答案是将其保存在本地驱动器上的临时文件中,然后上传。
但是,由于本地存储和权限限制,我不能这样做。
之前接受的答案是使用SetContentString(image_string.decode('utf-8'))因为

SetContentString需要str而不是bytes类型的参数。

但是错误: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte出现,如对该答案的评论。
有没有办法在不使用临时文件的情况下做到这一点,使用PIL / BytesIO /anything 可以将其转换为正确上传为字符串或以某种方式使用 PIL 作为图像操作并使用SetContentFile()上传?

我正在尝试做的一个基本示例是:

img_content = requests.get('https://i.imgur.com/A5gIh7W.jpeg')
file = drive.CreateFile({...})
file.setContentString(img_content.decode('utf-8'))
file.Upload()

当我看到 pydrive 的文档( 上传和更新文件内容)时,它说如下。

管理文件内容就像管理文件元数据一样简单。 您可以使用 SetContentFile(filename) 或 SetContentString(content) 设置文件内容,然后调用 Upload(),就像上传或更新文件元数据一样。

并且,我搜索了将二进制数据直接上传到 Google Drive 的方法。 但是,我找不到它。 从这种情况来看,我认为可能没有这种方法。 所以,在这个答案中,我想建议使用requests模块上传二进制数据。 在这种情况下,访问令牌是从 pydrive 的授权脚本中检索的。 示例脚本如下。

示例脚本:

from pydrive.auth import GoogleAuth
import io
import json
import requests


url = 'https://i.imgur.com/A5gIh7W.jpeg' # Please set the direct link of the image file.
filename = 'sample file' # Please set the filename on Google Drive.
folder_id = 'root' # Please set the folder ID. The file is put to this folder.

gauth = GoogleAuth()
gauth.LocalWebserverAuth()
metadata = {
    "name": filename,
    "parents": [folder_id]
}
files = {
    'data': ('metadata', json.dumps(metadata), 'application/json'),
    'file': io.BytesIO(requests.get(url).content)
}
r = requests.post(
    "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart",
    headers={"Authorization": "Bearer " + gauth.credentials.access_token},
    files=files
)
print(r.text)

笔记:

  • 在此脚本中,假设您的 URL 是图像文件的直接链接。 请注意这一点。

  • 在这种情况下,使用uploadType=multipart 官方文档是这样说的。 参考

    使用此上传类型可在单个请求中快速传输小文件(5 MB 或更少)和描述文件的元数据。 要执行分段上传,请参阅执行分段上传。

    • 当您要上传大尺寸的数据时,请使用可续传。 参考

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM