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

批量上传文件至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:55:16