栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django REST Framework上传图片:“提交的数据不是文件”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django REST Framework上传图片:“提交的数据不是文件”

你遇到的问题是Django REST框架希望通过标准文件上传方法将文件作为多部分表单数据上传。这通常是一个file字段,但是Javascript Blob对象也适用于AJAX。

你正在寻找使用base64编码的字符串而非原始文件(默认情况下不支持)上传文件。那里有a的base64ImageField实现,但是最有前途的是pull请求。

由于这些文件主要是为Django REST框架2.x设计的,因此我对pull请求中的一个文件进行了改进,并创建了一个应与DRF 3兼容的文件。

serializers.py

from rest_framework import serializers    class base64ImageField(serializers.ImageField):    """    A Django REST framework field for handling image-uploads through raw post data.    It uses base64 for encoding and decoding the contents of the file.    Heavily based on    https://github.com/tomchristie/django-rest-framework/pull/1268    Updated for Django REST framework 3.    """    def to_internal_value(self, data):        from django.core.files.base import ContentFile        import base64        import six        import uuid        # Check if this is a base64 string        if isinstance(data, six.string_types): # Check if the base64 string is in the "data:" format if 'data:' in data and ';base64,' in data:     # Break out the header from the base64 content     header, data = data.split(';base64,') # Try to depre the file. Return validation error if it fails. try:     depred_file = base64.b64depre(data) except TypeError:     self.fail('invalid_image') # Generate file name: file_name = str(uuid.uuid4())[:12] # 12 characters are more than enough. # Get the file name extension: file_extension = self.get_file_extension(file_name, depred_file) complete_file_name = "%s.%s" % (file_name, file_extension, ) data = ContentFile(depred_file, name=complete_file_name)        return super(base64ImageField, self).to_internal_value(data)    def get_file_extension(self, file_name, depred_file):        import imghdr        extension = imghdr.what(file_name, depred_file)        extension = "jpg" if extension == "jpeg" else extension        return extension

应该用它代替

ImageField
Django REST框架提供的标准。所以你的序列化器会变成

class ImageSerializer(serializers.ModelSerializer):    image = base64ImageField(        max_length=None, use_url=True,    )    class meta:        model = Image        fields = ("id", 'image', 'owner', 'time_created', )

这应该允许你指定base64编码的字符串,或者指定BlobDjango REST框架通常期望的标准对象。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393854.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号