Django:如何将字节对象保存到models.FileField?

时间:2018-12-25 20:04:54

标签: python django

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

  1. 使用Django的后端
  2. 使用React的前端。

我有一个与React的表格。我从客户端表单发送文件,并在Django应用程序中使用API​​View接收文件。

我收到一个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并将bytes对象转换为m3u文件。 你怎么做?

4 个答案:

答案 0 :(得分:1)

  1. models.FileField(models.ImageField)需要像对象一样的django.core.files.base.File 例如)

    • django.core.files.images.ImageFile

    • django.core.files.base.ContentFile

  2. ImageFile或ContentFile需要两个参数。

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

    2. 名称:str。 (重要!没有名称,它将无法使用)。

  3. bytes对象没有IO的方法(例如,seek())。应该将其转换为IO对象。

models.py

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

views.py或consumers.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)

答案 1 :(得分:0)

您可以尝试:

from django.core.files.base import ContentFile

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

您可以使用具有.m3u扩展名的文件名,并且应该具有它。

答案 2 :(得分:0)

我使用临时文件解决了。我使用了这段代码:

this.facturasElectricas = []

答案 3 :(得分:-1)

将字符串转换为字节

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)

我为翻译错误而道歉,我仍然只学习英语。