Открытие Django InMemoryUploadedFile приводит к ошибке операции ввода-вывода?

avatar
Owen Percoco
1 июля 2021 в 21:19
54
1
0

Я пытаюсь загрузить файл в корзину с помощью Django. Файл поступает из представления, очищается, а затем загружается в s3 с помощью служебной функции в модели.

вот функция загрузки:

def upload_file(file_obj, object_name=None):
    """Upload a file to an S3 bucket

    :param file_obj: File to upload
    :param object_name: S3 object name. If not specified then file_obj is used
    :return: True if file was uploaded, else False
    """

    bucket = settings.BUCKET

    # If S3 object_name was not specified, use file_obj
    if object_name is None:
        object_name = file_obj

    s3 = boto3.client('s3')
    try:
        s3.upload_fileobj(file_obj.open(), bucket, object_name)

    except ClientError as e:
        logging.error(e)
        return False
    return True

возвращается ошибка:

  File "/opt/profiles/profiles/core/utils.py", line 217, in upload_file
s3.upload_fileobj(file_obj.open(), bucket, object_name)
  File "/usr/local/lib/python3.8/site-packages/django/core/files/uploadedfile.py", line 90, in open
    self.file.seek(0)
ValueError: I/O operation on closed file.

Теперь, что странно для меня, так это то, что ошибка исходит от file_obj.open(), какой смысл в методе open, который не может открыть закрытый файл? Я не хочу передавать request.file прямо из представления, как у меня в установщике свойств, и хотел бы, чтобы он срабатывал всякий раз, когда свойство изменяется в модели, но я просто не могу понять, каким должен быть правильный процесс .

Источник

Ответы (1)

avatar
Owen Percoco
2 июля 2021 в 18:12
0

Ну, по крайней мере, часть ошибки связана с установкой двух полей файла. Как только вы установите его, файловый объект, по сути, готов.