Получение ошибки 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)
Вернуться на верх