首页 > 解决方案 > Django:如何将字节对象保存到models.FileField?

问题描述

我的 Web 应用程序具有以下结构:

  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 文件。你是怎么做到的?

标签: pythondjango

解决方案


  1. models.FileField( models.ImageField) 需要django.core.files.base.File像对象 ex)

    • django.core.files.images.ImageFile

    • django.core.files.base.ContentFile

  2. ImageFileContentFile需要两个参数。

    1. IO 对象:具有seek()方法(ex)io.BytesIO)。

    2. 名称:str。(重要!没有名字,它不会工作)。

  3. bytes 对象没有 IO 的方法(ex)seek())。它应该被转换为 IO 对象。


模型.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)

推荐阅读