1. 在settings中设置上传路径
# 文件上传的保存路径
MEDIA_ROOT = BASE_DIR / 'file/image'
# 指定文件获取的url路径
MEDIA_URL = 'file/image/'
2. 用户的序列化器
class UserSerializers(serializers.ModelSerializer):
""" 用户的序列化器 """
class Meta:
model = User
fields = ['id', 'username', 'email', 'mobile', 'avatar', 'last_name']
3. 视图函数
class UserView(GenericViewSet, mixins.RetrieveModelMixin):
""" 用户相关的用户级集 """
queryset = models.User.objects.all()
serializer_class = UserSerializers
# 设置认证用户才能访问
permission_classes = [IsAuthenticated, UserPermissions]
def upload_avatar(self, request: Request, *args, **kwargs):
# 1. 获取用户上传的对象
avatar = request.data.get('avatar')
# 2. 校验用户对象是否存在
if not avatar:
return Response({'error': '上传失败,文件不能为空!'}, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
# 3. 校验文件大小,不能为300kb
if avatar.size > 1024 * 300:
return Response({'error': '上传失败,文件大小不能超过300kb!'}, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
# 4. 保存文件
# 4.1 获取用户信息
user = self.get_object()
# 4.2 获取序列化对象
# partial=True表示会对只传的数据进行校验即这里的data={"avatar": avatar},否则会对UserSerializers中所有的数据进行校验
# 这样校验肯定不通过,因为我们只需要保存avatar
ser = self.get_serializer(user, data={"avatar": avatar}, partial=True)
# 4.3 校验序列化器
ser.is_valid(raise_exception=True)
# 4.4 保存
ser.save()
# 4.5 返回文件地址
# "url": "http://127.0.0.1:8000/file/image/image-20220903102113338_rmNPinx.png"
return Response({'url': ser.data['avatar']})
4. url设置
urlpatterns = [
# 上传用户头像的路由
path('avatar/<int:pk>/upload/',UserView.as_view({'post':'upload_avatar'}))
]