首页 > 解决方案 > 如何获取将图像上传到 s3 存储桶的文件名?

问题描述

您好,我在将文件添加到 s3 存储桶时遇到问题....

我正在分享我的模型

class UserProfile(SoftDeletionModel, BaseModel):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=100, blank=True)
    contact_number = models.CharField(max_length=20, blank=True)
    profile_pic=models.TextField(blank=True, null=True)

这是我的序列化程序类

class UserprofileSerializer(ModelSerializer):
    class Meta:
        model = UserProfile
        exclude = ['deleted_at','created_date','modified_date']
        extra_kwargs = {'user': {'required': False}}

这是我的看法

class UserProfileUpdateView(UpdateAPIView):
    def get_queryset(self, *args, **kwargs):
        queryset_list = UserProfile.objects.filter(
            user=self.request.user)

        return queryset_list
    serializer_class = UserprofileSerializer

我面临的问题是.....作为图像上传的个人资料图片......但在我的模型中它创建为一个文本字段,用于保存 s3 存储桶代理 url......

我需要获取用于在 s3 存储桶中创建路径的文件名......

那么我该怎么做呢?

标签: djangodjango-rest-framework

解决方案


您可以request.FILES['profile_pic']在此处使用“profile_pic”是您要上传的输入字段名称。

     image = request.FILES['profile_pic']

那么你可以使用imageobject 作为BodyS3 的参数。假设您编写了一个upload_to_s3使用 boto3 将图像上传到 S3 的函数。

  1. profile_pic从序列化程序中排除。
  2. 更改您的代码如下:

      def upload_to_s3(image_object):
          // upload to s3 and get url using boto3
          return url
    
    
      class UserProfileUpdateView(UpdateAPIView):
           serializer_class = UserprofileSerializer
    
           def perform_update(self, serializer):
               image = request.FILES['profile_pic']
               serializer.validated_data['profile_pic'] = upload_to_s3(image)
               serializer.save()
    

profile_pic字段类型转换为URLField()


推荐阅读