使用 PyDrive 将图像上传到 Google 驱动器
Upload Image to Google Drive using PyDrive
我有一个关于 PyDrive 的愚蠢问题。
我尝试使用 FastAPI 制作一个 REST API,它将使用 PyDrive 将图像上传到 Google 驱动器。这是我的代码:
from fastapi import FastAPI, File
from starlette.requests import Request
from starlette.responses import JSONResponse
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
app = FastAPI()
@app.post('/upload')
def upload_drive(img_file: bytes=File(...)):
g_login = GoogleAuth()
g_login.LoadCredentialsFile("google-drive-credentials.txt")
if g_login.credentials is None:
g_login.LocalWebserverAuth()
elif g_login.access_token_expired:
g_login.Refresh()
else:
g_login.Authorize()
g_login.SaveCredentialsFile("google-drive-credentials.txt")
drive = GoogleDrive(g_login)
file_drive = drive.CreateFile({'title':'test.jpg'})
file_drive.SetContentString(img_file)
file_drive.Upload()
尝试访问我的端点后,出现此错误:
file_drive.SetContentString(img_file)
File "c:\users\aldho\anaconda3\envs\fastai\lib\site-packages\pydrive\files.py", line 155, in SetContentString
self.content = io.BytesIO(content.encode(encoding))
AttributeError: 'bytes' object has no attribute 'encode'
我应该怎么做才能完成这个非常简单的任务?
感谢您的帮助!
**
已更新
**
感谢 Stanislas Morbieu 的回答和评论,这是我更新后的工作代码:
from fastapi import FastAPI, File
from starlette.requests import Request
from starlette.responses import JSONResponse
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from PIL import Image
import os
app = FastAPI()
@app.post('/upload')
def upload_drive(filename, img_file: bytes=File(...)):
try:
g_login = GoogleAuth()
g_login.LocalWebserverAuth()
drive = GoogleDrive(g_login)
file_drive = drive.CreateFile({'title':filename, 'mimeType':'image/jpeg'})
if not os.path.exists('temp/' + filename):
image = Image.open(io.BytesIO(img_file))
image.save('temp/' + filename)
image.close()
file_drive.SetContentFile('temp/' + filename)
file_drive.Upload()
return {"success": True}
except Exception as e:
print('ERROR:', str(e))
return {"success": False}
谢谢大家
SetContentString
需要 str
而非 bytes
类型的参数。这是文档:
Set content of this file to be a string.
Creates io.BytesIO instance of utf-8 encoded string. Sets mimeType to be ‘text/plain’ if not specified.
因此,您应该将 img_file
(bytes
类型)解码为 utf-8:
file_drive.SetContentString(img_file.decode('utf-8'))
使用file_drive.SetContentFile(img_path)
这解决了我的问题
我有一个关于 PyDrive 的愚蠢问题。 我尝试使用 FastAPI 制作一个 REST API,它将使用 PyDrive 将图像上传到 Google 驱动器。这是我的代码:
from fastapi import FastAPI, File
from starlette.requests import Request
from starlette.responses import JSONResponse
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
app = FastAPI()
@app.post('/upload')
def upload_drive(img_file: bytes=File(...)):
g_login = GoogleAuth()
g_login.LoadCredentialsFile("google-drive-credentials.txt")
if g_login.credentials is None:
g_login.LocalWebserverAuth()
elif g_login.access_token_expired:
g_login.Refresh()
else:
g_login.Authorize()
g_login.SaveCredentialsFile("google-drive-credentials.txt")
drive = GoogleDrive(g_login)
file_drive = drive.CreateFile({'title':'test.jpg'})
file_drive.SetContentString(img_file)
file_drive.Upload()
尝试访问我的端点后,出现此错误:
file_drive.SetContentString(img_file)
File "c:\users\aldho\anaconda3\envs\fastai\lib\site-packages\pydrive\files.py", line 155, in SetContentString
self.content = io.BytesIO(content.encode(encoding))
AttributeError: 'bytes' object has no attribute 'encode'
我应该怎么做才能完成这个非常简单的任务?
感谢您的帮助!
**
已更新
**
感谢 Stanislas Morbieu 的回答和评论,这是我更新后的工作代码:
from fastapi import FastAPI, File
from starlette.requests import Request
from starlette.responses import JSONResponse
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from PIL import Image
import os
app = FastAPI()
@app.post('/upload')
def upload_drive(filename, img_file: bytes=File(...)):
try:
g_login = GoogleAuth()
g_login.LocalWebserverAuth()
drive = GoogleDrive(g_login)
file_drive = drive.CreateFile({'title':filename, 'mimeType':'image/jpeg'})
if not os.path.exists('temp/' + filename):
image = Image.open(io.BytesIO(img_file))
image.save('temp/' + filename)
image.close()
file_drive.SetContentFile('temp/' + filename)
file_drive.Upload()
return {"success": True}
except Exception as e:
print('ERROR:', str(e))
return {"success": False}
谢谢大家
SetContentString
需要 str
而非 bytes
类型的参数。这是文档:
Set content of this file to be a string.
Creates io.BytesIO instance of utf-8 encoded string. Sets mimeType to be ‘text/plain’ if not specified.
因此,您应该将 img_file
(bytes
类型)解码为 utf-8:
file_drive.SetContentString(img_file.decode('utf-8'))
使用file_drive.SetContentFile(img_path)
这解决了我的问题