drf中图片存储报错
来源:9-6 用户留言功能

慕后端2457845
2020-11-24
微信小程序端传递过来图片之后,创建了一个专门的方法使用uuid生成并返回图片名字,防止图片太多名字重复的问题。图片可以正常写入到文件中,但是把新的文件名和其他的数据传入进行反序列化的时候报了如下错误:{“images”:[“提交的数据不是一个文件。请检查表单的编码类型。”]},新的图片名是str类型的,不知道错在哪
# 提取出公共的方法evaluation_directory_path获取图片后缀
# 使用uuid创建唯一的图片名,并保存的路径和文件名一并返回
def evaluation_directory_path(product_id, filename):
ext = filename.split(".")[-1]
filename = '{}.{}'.format(uuid.uuid4().hex[:10], ext)
return os.path.join("evaluations", filename)
class ProductEvaluationImageView(GenericAPIView):
queryset = ProductEvaluationImage.objects.all()
serializer_class = ProdcutEvaluationImageSerializers
def post(self, request):
data = request.data
files = request.FILES.getlist('upload')
product_id = request.data['product_id']
user_id = request.data['user_id']
for file in files:
filename = evaluation_directory_path(product_id, file.name)
with open(os.path.join(settings.MEDIA_ROOT, filename), "wb") as f:
for chunk in file.chunks():
f.write(chunk)
f.close()
serializer = self.get_serializer(
data={"images": filename, "product_id": product_id, "user_id": user_id})
serializer.is_valid(raise_exception=True)
serializer.save()
return Response("获取成功", status=200)
class ProductEvaluationImage(models.Model):
evaluation = models.ForeignKey(
ProductEvaluation, related_name="evaluation_images", default="", on_delete=models.CASCADE, verbose_name="关联评论")
images = models.ImageField(
null=True, blank=True, upload_to=evaluation_directory_path, verbose_name="商品评价图片")
class Meta:
verbose_name = "商品评价关联图"
verbose_name_plural = verbose_name
def __str__(self):
return self.evaluation.detail_content
写回答
1回答
-
bobby
2020-11-26
前端传递文件的时候需要使用form表单提交,你前端传递的数据是如何传输到后端的?
022020-11-28
Python前后端分离开发Vue+Django REST framework实战
Django REST framework课程视频,RESTFul API前后端分离开发
2889 学习 · 2467 问题
相似问题