Получение ошибки UnicodeDecodeError при преобразовании файла InMemoryUploadedFile в Google MediaUpload
Я прошу вашей помощи в следующей ситуации:
Я создаю приложение Django и организую экземпляр на Google App Engine, После запуска экземпляра Google App Engine он переходит в режим "только для чтения", и поэтому Django больше не может записывать файлы в "дисковое пространство"
В связи с этим, приложение Django получает 'File', отправленный через форму, согласно документации Django Загрузка файлов считается UploadedFile экземпляром, который затем становится подклассом InMemoryUploadedFile, Если я попытаюсь передать этот объект в класс MediaUpload, я получу следующее сообщение:
(<class 'TypeError'>, TypeError('expected str, bytes or os.PathLike объект, а не InMemoryUploadedFile'), <traceback object at 0x0000014D00669900>)
Мне нужно преобразовать этот объект в байтовый объект, поскольку моя конечная цель - загрузить этот файл в Google Drive с помощью API Google
Я попытался прочитать объект (предполагая, что метод 'read' вернет rawdata (байты)), но я получаю ошибку Decode, когда я делаю это.
Загрузка файла на Google Drive описана в их документации, но похоже, что класс MediaFileUpload принимает только строки/пути, а если принимает байты, то непонятно. Глядя на сообщение об ошибке, я получил "(<class 'UnicodeDecodeError'>, UnicodeDecodeError...."
Изображение ошибки Ошибка CMDкод.
def expupdate(request):
try:
creds, _ = google.auth.default()
service = build('drive', 'v3', credentials=creds)
myfile = request.FILES['archivo']
print(myfile.content_type)
Mtype = myfile.content_type
print(myfile.size)
byte_object_after_read = myfile.read()
media = MediaFileUpload(byte_object_after_read,mimetype=Mtype)
file_metadata = {'name': 'test.jpeg'}
file = service.files().create(body=file_metadata, media_body=media,
fields='id').execute()
fileid = file.get("id")
print(fileid)
except:
e = sys.exc_info()
print('An error occurred:')
print(e)
Решение было довольно простым.
Оказывается, Google предлагает класс MediaIoBaseUpload, который в основном принимает на вход объект Bytes и создает необходимые
Итак, решение для сбора файла из FORM в django с помощью appengine и последующей загрузки его на Google Drive без сохранения файла (управление в памяти) следующее
def expupdate(request):
try:
creds, _ = google.auth.default()
service = build('drive', 'v3', credentials=creds)
myfile = request.FILES['archivo']
Mtype = myfile.content_type
fh = myfile.open()
media = MediaIoBaseUpload(fh,mimetype=Mtype)
file_metadata = {'name': 'test.jpeg'}
file = service.files().create(body=file_metadata,
media_body=media,fields='id').execute()
fileid = file.get("id")
print(fileid)
except:
e = sys.exc_info()
print('An error occurred:')
print(e)