Django+Ajax多段上传AWS S3:预签名URL获取及报错排查
问题1:DataError(字段值超出character varying(100)长度限制)解决方法
- 问题根源:Django模型中存储S3上传相关数据(如对象键
object_key、上传IDupload_id)的字段被设置了max_length=100,但实际生成的S3资源标识符长度超过了该限制。 - 修复步骤:
- 打开对应模型文件,找到触发错误的字段,将
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) # 若该字段也触发错误,一并修改 - 生成并执行数据库迁移,更新字段长度:
python manage.py makemigrations python manage.py migrate - (可选)优化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后直接用于视频播放
- 确保运行Django的服务拥有S3的
内容的提问来源于stack exchange,提问作者MrLonely
相关产品推荐
相关产品推荐

