python - Django:如何将字节对象保存到models.FileField?
问题描述
我的 Web 应用程序具有以下结构:
- 用 Django 做后端
- 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 文件。你是怎么做到的?
解决方案
models.FileField
(models.ImageField
) 需要django.core.files.base.File
像对象 ex)django.core.files.images.ImageFile
django.core.files.base.ContentFile
ImageFile
或ContentFile
需要两个参数。IO 对象:具有
seek()
方法(ex)io.BytesIO
)。名称:
str
。(重要!没有名字,它不会工作)。
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)
推荐阅读
- python-3.x - 如何在 Python 中从 CSV 列中绘制频率
- laravel - Laravel /admin 路由不能转到另一个路由,总是回到 /admin
- c++ - 如何只考虑 *pointer 中的前两个元素
- ruby-on-rails - rspec:模型未定义方法上的辅助方法
- xampp - 在mac终端中选择*时MariaDB不显示数据
- python - urllib.request.urlopen 不向列表返回任何内容并引发 indexerror
- yii2 - 使用来自 Gridview Yii2 的数据将数据导出到 excel
- django - 我不确定如何请求 Django rest-framework Social Oauth2
- java - 如何为一个孩子设置多个对象?
- python - 我如何用百分比打印差异