Django: как сохранить байтовый объект в models.FileField?

Мое веб-приложение имеет следующую структуру:

  1. бэкэнд с Django
  2. интерфейс с React.

У меня есть форма с React. Я отправляю файл из клиентской формы и получаю файл в своем приложении Django с APIView.

Я получаю файл m3u как байтовый объект.

b'------WebKitFormBoundaryIaAPDyj9Qrx8DrWA\r\nContent-Disposition: 
form-data; name = "upload"; 
filename = "test.m3u"\r\nContent-Type: audio/x- 
mpegurl\r\n\r\n#EXTM3U\n#EXTINF:-1 tvg-ID = "" tvg-name = "...

Я бы сохранил файл в модели Django в models.FileField и преобразовал бы объект байтов в файл m3u. Как ты это делаешь?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
14
0
9 676
4

Ответы 4

Можешь попробовать:

from django.core.files.base import ContentFile
import base64

file_data = ContentFile(base64.b64decode(fileData))
object.file.save(file_name, file_data)

Вы можете использовать имя_файла с расширением .m3u, и оно у вас будет.

Решил использовать временный файл. Я использовал этот код:

extM3u = str.encode(body.decode('utf8').split('EXTM3U\n#')[1].split('------WebKitFormBoundary')[0])

fileTemp = NamedTemporaryFile(delete=True, dir='media/tmp')
fileTemp.write(extM3u)
filenameRe = re.compile('.*?filename=[\'"](.*?)[\'"]')
filename = regParse(filenameRe, body.decode('utf8'))
file = File(fileTemp, name=filename)
m3u = M3u(titleField=filename, fileField=file)
m3u.save()
  1. models.FileField (models.ImageField) нуждается в объектах типа django.core.files.base.File бывший)

    • django.core.files.images.ImageFile

    • django.core.files.base.ContentFile

  2. ImageFile или ContentFile требует двух аргументов.

    1. Объект ввода-вывода: с методом seek() (например, io.BytesIO).

    2. имя: str. (важно! без имени работать не будет).

  3. объект bytes не имеет методов ввода-вывода (например, seek()). он должен быть преобразован в объект ввода-вывода.


models.py

class Message(models.Model):
    image = models.ImageField(upload_to='message_image/%Y/%m', null=True)

views.py или consumer.py или some-where.py

import io
from django.core.files.images import ImageFile
from myapp.models import Message

def create_image_message(image_bytes):
    image = ImageFile(io.BytesIO(image_bytes), name='foo.jpg')  # << the answer!
    new_message = Message.objects.create(image=image)

Спасибо! Это правильный и рабочий ответ.

valex 29.03.2021 12:16

Действительно хорошее объяснение.

Anurag Rana 13.07.2021 19:28

преобразовать строку в байты

bytes_data = ... # bytes

string_data = bytes_data.hex() # this is a string that you can save in TextField in django model


затем, чтобы получить байты из строки:

bytes_data_2 = bytes.fromhex(string_data)

Прошу прощения за кривый перевод, пока только английский учу.

не сохраняйте файлы в текстовых полях

Daniel Benedykt 12.02.2021 00:33

Другие вопросы по теме