Django Rest Framework:无法序列化或保存上传的图像
Posted
技术标签:
【中文标题】Django Rest Framework:无法序列化或保存上传的图像【英文标题】:Django Rest Framework: Cannot serialize or save uploaded image 【发布时间】:2018-07-14 16:39:38 【问题描述】:无法在 APIview 中序列化或保存上传的图像。 如果保存,文件已损坏且无法打开。如果序列化,得到: "头像":["没有提交文件。"] 请求内容:
MultiValueDict: u'name': [<TemporaryUploadedFile: Avatar.jpg (image/jpeg)>]
设置:
FILE_UPLOAD_HANDLERS = [
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')
网址:
urlpatterns = [
url(r'^test/$', TestReturn.as_view(), name='test-detail'),
url(r'^users/$', UserProfileAll.as_view(), name='userprofile-detail'),
url(r'^avatar/', UploadAvatar.as_view(), name='images')
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
型号:
class AvatarStorage(models.Model):
avatar = models.ImageField(verbose_name="Uploaded image", upload_to='media', null=True)
序列化器:
class AvatarStorageSerializer(serializers.ModelSerializer):
avatar = serializers.ImageField(use_url=True)
class Meta:
model = AvatarStorage
fields = '__all__'
观看次数:
class UploadAvatar(APIView):
parser_classes = (MultiPartParser,)
def post(self, request, format=None):
serializer = AvatarStorageSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
为了发帖,我使用 Postman,在那里设置:Body=>Form-Data 并从磁盘中选择一个文件。
如果它很重要,这是移动 API
【问题讨论】:
我认为 AvatarStorageSerializer 中不需要 Avatar 字段规范。 【参考方案1】:将设置文件 FILE_UPLOAD_HANDLERS 更新为这样
FILE_UPLOAD_HANDLERS=[
'django.contrib.staticfiles.finders.MemoryFileUploadHandler',
'django.contrib.staticfiles.finders.TemporaryFileUploadHandler',
]
如果你想了解更多,read this
【讨论】:
它没有帮助,我还需要使用 TemporaryFileUploadHandler 而不是 MemoryFileUploadHandler 作为我的 imgs 大约 5-10 mb,而 MemoryFileUploadHandler 设计为最大 2.5mb 我已经实现了这个东西,现在我上传了 8mb 的图像。图片保存完好无损。 你能具体告诉我你的问题是什么【参考方案2】:问题不在代码中,我在 Postman 中缺少必需的标头:
Content-Disposition: attachment; filename=upload.jpg;
【讨论】:
以上是关于Django Rest Framework:无法序列化或保存上传的图像的主要内容,如果未能解决你的问题,请参考以下文章
无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL
无法让 CORS 与内容类型一起使用 - Django Rest Framework
Django Rest Framework:无法序列化或保存上传的图像
python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)