Мое веб-приложение имеет следующую структуру:
У меня есть форма с 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. Как ты это делаешь?






Можешь попробовать:
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()
models.FileField (models.ImageField) нуждается в объектах типа django.core.files.base.File
бывший)
django.core.files.images.ImageFile
django.core.files.base.ContentFile
ImageFile или ContentFile требует двух аргументов.
Объект ввода-вывода: с методом seek() (например, io.BytesIO).
имя: str. (важно! без имени работать не будет).
объект 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)
Действительно хорошее объяснение.
преобразовать строку в байты
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)
не сохраняйте файлы в текстовых полях
Спасибо! Это правильный и рабочий ответ.