В соответствии с исходным кодом для 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/
Таким образом, вы можете получить байты данных из объекта InMemoryUploadedFile
и передать их функции block_blob_service.create_blob_from_bytes
.
Между тем, как я знаю, это не очень хорошая идея. Простое решение для создания большого двоичного объекта из загруженного файла в Django - это использование django-storages
с внутренним хранилищем Azure, см. Его документ о Azure Storage , чтобы узнать, как его использовать. И существует существующий аналогичный поток SO Django Azure, загружающий файл в хранилище BLOB-объектов , к которому вы можете обратиться.