You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+Ajax多段上传AWS S3:预签名URL获取及报错排查

问题1:DataError(字段值超出character varying(100)长度限制)解决方法
  • 问题根源:Django模型中存储S3上传相关数据(如对象键object_key、上传IDupload_id)的字段被设置了max_length=100,但实际生成的S3资源标识符长度超过了该限制。
  • 修复步骤:
    1. 打开对应模型文件,找到触发错误的字段,将max_length调整为足够大的值(建议255或500,S3对象键最长支持1024字符):
      # 示例模型字段修改
      class VideoUpload(models.Model):
          s3_object_key = models.CharField(max_length=255)  # 原max_length=100
          upload_id = models.CharField(max_length=255)      # 若该字段也触发错误,一并修改
      
    2. 生成并执行数据库迁移,更新字段长度:
      python manage.py makemigrations
      python manage.py migrate
      
    3. (可选)优化S3对象键命名规则,避免不必要的超长路径,但核心解决方式仍是调整字段长度。
问题2:获取非公开视频的有效预签名URL

AWS S3预签名URL可为私有对象生成临时访问链接,直接通过boto3的generate_presigned_url方法实现,结合Django视图返回给前端:

  • 核心代码实现(Django视图):
    import boto3
    from django.http import JsonResponse
    from django.views.decorators.http import require_GET
    
    @require_GET
    def get_video_presigned_url(request):
        # 从请求参数获取对象键
        object_key = request.GET.get("object_key")
        if not object_key:
            return JsonResponse({"error": "缺少object_key参数"}, status=400)
        
        # 初始化S3客户端(确保Django已配置AWS凭证,比如通过环境变量或settings)
        s3_client = boto3.client("s3")
        bucket_name = "你的S3存储桶名称"
        
        # 生成预签名URL,有效期1小时(可根据需求调整ExpiresIn)
        presigned_url = s3_client.generate_presigned_url(
            ClientMethod="get_object",
            Params={"Bucket": bucket_name, "Key": object_key},
            ExpiresIn=3600
        )
        
        return JsonResponse({"presigned_url": presigned_url})
    
  • 注意事项:
    • 确保运行Django的服务拥有S3的s3:GetObject权限(通过IAM角色或Access Key配置)
    • 预签名URL的有效期ExpiresIn可根据业务需求调整,最长不超过7天(受AWS限制)
    • 前端可通过Ajax请求该视图,获取URL后直接用于视频播放

内容的提问来源于stack exchange,提问作者MrLonely

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:41:03