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表单提交,你前端传递的数据是如何传输到后端的?

0
2
bobby
回复
慕后端2457845
好的。
2020-11-28
共2条回复

Python前后端分离开发Vue+Django REST framework实战

Django REST framework课程视频,RESTFul API前后端分离开发

2889 学习 · 2467 问题

查看课程