批量上传文件至S3 Bucket时出现CORS错误(基于boto3)
问题
使用Python的boto3库连接AWS S3批量上传文件时,遇到以下异常:
- 单次上传5-10个文件无异常
- 上传超过30个文件时,部分文件随机出现502-CORS错误(例如0-15号文件正常、16号报错、17-25号正常、26号报错)
相关代码
获取S3客户端代码
def get_client(): return boto3.client('s3', aws_access_key_id = 'AWS_ACCESS_KEY', aws_secret_access_key = 'AWS_SECRET_KEY')
批量上传代码
for item in img_files: file_type = '' uuid_key = uuid.uuid4() fs = FileSystemStorage() filename = fs.save(f'{S3_TEMP_FOLDER}{uuid_key}-{item.name}', item) file_o_name, file_o_ext = os.path.splitext(filename) if file_o_ext.lower() in ['.jpg', '.png', '.jpeg']: file_type = 'image' else: file_type = 'video' uploaded_file_path = fs.path(filename) try: s3_client.upload_file(uploaded_file_path, bucket_name, f'{folder_key}/{uuid_key}-{item.name}', ExtraArgs={'ACL': 'public-read'}) uploaded_data = { "file_name": item.name, "file_key": f'{folder_key}/{uuid_key}-{item.name}', "bucket_name": bucket_name, "folder_id": get_folder_id.id, "created_by": request.user.username, "updated_by": request.user.username, "bucket_id": bucket.id, "file_type": file_type } S3FileManagement.objects.create(**uploaded_data) except Exception as e: logger.error({'message': str(e)}) logger.error({'message': S3_FOLDER_MESSAGE['S3_FILE_UPLOAD_FAILED']}) return Response({'message': S3_FOLDER_MESSAGE['S3_FILE_UPLOAD_FAILED']}, status=status.HTTP_400_BAD_REQUEST)
当前环境与配置
- 后端部署:aapanel
- 前端技术栈:ReactJS + Ant Design
- 后端CORS配置:
CORS_ORIGIN_ALLOW_ALL = True CORS_ALLOWED_ORIGINS = [ '..{url}..vercel.app', ] CSRF_TRUSTED_ORIGINS = [ '..{url}..vercel.app', ]
需解决批量大数量文件上传时的随机502-CORS错误,请问还需哪些额外配置?
解决方案
1. 优化S3客户端与上传并发逻辑
- 复用S3客户端:确保
get_client()只初始化一次,避免循环内重复创建连接导致资源耗尽,可将客户端实例设为全局变量或单例。 - 控制上传并发:改用
boto3.s3.transfer.S3Transfer配置并发参数,或引入Celery等异步任务框架将上传任务异步化,避免同步阻塞主线程引发连接超时。
2. 配置AWS S3 Bucket的CORS规则
后端CORS仅针对自身服务,S3 Bucket需单独配置CORS规则,允许前端域名的上传请求:
<CORSConfiguration> <CORSRule> <AllowedOrigin>https://your-frontend-domain.vercel.app</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>GET</AllowedMethod> <AllowedHeader>*</AllowedHeader> <ExposeHeader>ETag</ExposeHeader> </CORSRule> </CORSConfiguration>
替换为实际前端域名,确保覆盖上传所需的HTTP方法,并暴露必要响应头。
3. 调整aapanel服务器配置
- 修改Nginx参数:调高
worker_connections(如设为10240)、延长keepalive_timeout(如65s)、增大client_max_body_size,避免因连接数超限或请求超时触发502。 - 优化Python服务进程:若使用uWSGI/Gunicorn,增加worker进程数和线程数,提升服务并发处理能力。
4. 优化前端上传逻辑
- 启用分片上传:利用Ant Design Upload组件的分片上传功能,将大文件拆分为小块上传,降低单次请求负载。
- 添加重试机制:对上传失败的请求设置自动重试(如3次),抵消网络波动导致的随机错误。
- 限制并发数:前端控制同时上传的文件数量(如一次最多5个),避免短时间内发送大量请求压垮后端或触发S3请求限制。
5. 修复后端错误处理逻辑
- 取消单次失败即返回的逻辑:捕获单个文件上传错误后仅记录日志,继续处理剩余文件,最后统一返回失败文件列表,避免影响整体上传流程。
- 增强日志粒度:记录每个文件上传的请求ID、时间、错误详情,便于定位具体出错请求的原因。
内容的提问来源于stack exchange,提问作者Minh Nhựt Nguyễn
相关产品推荐
相关产品推荐

