StringIO как класс, который расширяет django.core.files. Файл

class MyModel(models.Model)
 image = models.FileField(upload_to="blagh blagh...")
 #more spam...

У меня есть файл в памяти, и я хочу сохранить ее через Django FileField, сохраняют метод, как это:

photo.image.save(name, buffer) # second arg should be django File

Я попытался использовать StringIO, но он не расширяет django.core.files. Файл и таким образом не реализует блоки метода (). Я перенес его в объект Файла как этот:

buffile = File(buffer, name) # first argument should be a file
photo.image.save(name, buffile)

Но методы Файла используют размер и поля имени предоставленного файла. StringIO не определяет их. Я нашел это, но ссылка является битой

6
задан Community 23 May 2017 в 12:24
поделиться

3 ответа

Если у вас есть поток байтов, который вы хотите сохранить в FileField / ImageField, вот код, который может помочь:

>>> from django.core.files.uploadedfile import InMemoryUploadedFile
>>> from cStringIO import StringIO
>>> buf = StringIO(data)  # `data` is your stream of bytes
>>> buf.seek(0, 2)  # Seek to the end of the stream, so we can get its length with `buf.tell()`
>>> file = InMemoryUploadedFile(buf, "image", "some_filename.png", None, buf.tell(), None)
>>> photo.image.save(file.name, file)  # `photo` is an instance of `MyModel`
>>> photo.image
<ImageFieldFile: ...>

Некоторые примечания:

  • Вы можете придумать любое имя для изображения, но вы, вероятно, захотите, чтобы расширение было точным
  • Второй аргумент InMemoryUploadedFile - это имя поля в вашей модели, поэтому "image"

Это немного привередливо, но выполняет свою работу. Будем надеяться, что в версии 1.3 / 4 API будет немного доработан.

Изменить:
См. ответ Джейсона , где описан более простой способ сделать это, хотя вам все равно нужно знать имя файла изображения.

7
ответ дан 8 December 2019 в 02:14
поделиться

Вы можете использовать ContentFile вместо File

from django.core.files.base import ContentFile

photo.image.save(name, ContentFile(buffer))
28
ответ дан 8 December 2019 в 02:14
поделиться

Используйте класс Image .

0
ответ дан 8 December 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: