Django открыл тип файла в Python открытый тип файла - PullRequest
0 голосов
/ 02 октября 2019

У меня есть приложение django, которое просит пользователя загрузить изображение. Я получаю изображение из HTML Django. Это изображение я передаю скрипту Python в качестве параметра. Я много чего сделал с этим изображением (например, с использованием библиотек PIL), класс параметра:

'django.core.files.uploadedfile.InMemoryUploadedFile'

Но проблема возникает, когда я пытаюсь использовать одну функцию, которая запрашивает предопределенный тип .open () python, а именно:

'_ io.BufferedReader'

Конкретно, функция, которую я использую: block_blob_service.create_blob_from_stream() (функция Microsoft Azure)

Итак, мой вопрос, можно ли преобразовать открытый тип файла django в открытый тип файла python? Это может быть без сохранения файла и повторного открытия.

И, если случайно кто-то работал с этой библиотекой, я также попытался block_blob_service.create_blob_from_bytes(), и она не работает (для преобразования из django в байтыЯ только что сделал img = django_input.read() (я получаю тип байтов) и block_blob_service.create_blob_from_path(), это не вариант, потому что я не могу получить путь к файлу или не хочу сохранить изображение и получитьновый путь.

1 Ответ

0 голосов
/ 08 октября 2019

В соответствии с исходным кодом для django.core.files.uploadedfile, класс InMemoryUploadedFile наследуется от класса UploadedFile, который наследуется от django.core.files.base.File, как указано в коде и на рисунке ниже.

from django.core.files.base import File

class UploadedFile(File):
    """
    An abstract uploaded file (``TemporaryUploadedFile`` and
    ``InMemoryUploadedFile`` are the built-in concrete subclasses).

    An ``UploadedFile`` object behaves somewhat like a file object and
    represents some file data that the user submitted with a form.
    """

    def __init__(self, file=None, name=None, content_type=None, size=None, charset=None, content_type_extra=None):
        super().__init__(file, name)
        self.size = size
        self.content_type = content_type
        self.charset = charset
        self.content_type_extra = content_type_extra

    def __repr__(self):
        return "<%s: %s (%s)>" % (self.__class__.__name__, self.name, self.content_type)

    def _get_name(self):
        return self._name

    def _set_name(self, name):
        # Sanitize the file name so that it can't be dangerous.
        if name is not None:
            # Just use the basename of the file -- anything else is dangerous.
            name = os.path.basename(name)

            # File names longer than 255 characters can cause problems on older OSes.
            if len(name) > 255:
                name, ext = os.path.splitext(name)
                ext = ext[:255]
                name = name[:255 - len(ext)] + ext

        self._name = name

    name = property(_get_name, _set_name)

class InMemoryUploadedFile(UploadedFile):
    """
    A file uploaded into memory (i.e. stream-to-memory).
    """
    def __init__(self, file, field_name, name, content_type, size, charset, content_type_extra=None):
        super().__init__(file, name, content_type, size, charset, content_type_extra)
        self.field_name = field_name

    def open(self, mode=None):
        self.file.seek(0)
        return self

    def chunks(self, chunk_size=None):
        self.file.seek(0)
        yield self.read()

    def multiple_chunks(self, chunk_size=None):
        # Since it's in memory, we'll never have multiple chunks.
        return False

Рисунок ниже взят из https://docs.djangoproject.com/en/2.2/ref/files/uploads/ enter image description here

Таким образом, вы можете получить байты данных из объекта InMemoryUploadedFile и передать их функции block_blob_service.create_blob_from_bytes.

Между тем, как я знаю, это не очень хорошая идея. Простое решение для создания большого двоичного объекта из загруженного файла в Django - это использование django-storages с внутренним хранилищем Azure, см. Его документ о Azure Storage , чтобы узнать, как его использовать. И существует существующий аналогичный поток SO Django Azure, загружающий файл в хранилище BLOB-объектов , к которому вы можете обратиться.

...