AWS Elastic Beanstalk上传文件夹路径查询及Flask文件上传方案咨询
AWS Elastic Beanstalk Python平台文件上传实现方案
1. 环境可写入目录路径
Elastic Beanstalk的Python运行环境(基于Amazon Linux 2)有两个常用的可写入路径,可用于暂存上传的文本文件:
- 系统临时目录
/tmp:所有进程默认拥有读写权限,EB不会限制该目录的写入操作,系统会定期清理目录内的过期文件,是暂存上传文件的首选路径。 - 应用部署目录
/opt/python/current/app:为当前部署的Flask应用根目录,仅web运行用户有写入权限,存在权限冲突风险,不推荐作为临时存储路径。
2. Flask中转上传实现示例
你可以参考以下代码实现iOS端上传文件到EB、EB再转存到S3的逻辑:
from flask import Flask, request import boto3 import os app = Flask(__name__) # EB环境默认已经分配了实例角色权限,不需要手动配置AK/SK s3_client = boto3.client('s3') TARGET_S3_BUCKET = "替换为你的S3存储桶名称" @app.route('/text/upload', methods=['POST']) def upload_text_file(): # 校验上传参数 if "text_file" not in request.files: return "缺少上传文件参数", 400 upload_file = request.files["text_file"] if upload_file.filename.strip() == "": return "文件名为空", 400 # 暂存文件到/tmp目录 temp_file_path = os.path.join("/tmp", upload_file.filename) upload_file.save(temp_file_path) # 转存到S3 s3_client.upload_file(temp_file_path, TARGET_S3_BUCKET, upload_file.filename) # 可选:删除本地临时文件释放存储空间 if os.path.exists(temp_file_path): os.remove(temp_file_path) return "文件上传成功", 200
3. 更优方案推荐
不需要通过EB中转文件的预签名URL方案,完全满足iOS端无需安装boto3的要求,还能节省EB服务器的带宽和计算资源,大文件上传场景下优势更明显:
- 先在EB端实现一个获取S3预签名上传URL的接口,参考代码如下:
@app.route('/s3/presigned-url', methods=['GET']) def generate_upload_url(): file_name = request.args.get("file_name") # 签名有效期设置为3600秒,可根据需求调整 presigned_url = s3_client.generate_presigned_url( ClientMethod="put_object", Params={ "Bucket": TARGET_S3_BUCKET, "Key": file_name }, ExpiresIn=3600 ) return {"upload_url": presigned_url}, 200
- iOS端先调用上述接口获取预签名URL,直接使用系统自带的HTTP PUT请求将文本文件上传到该URL即可,无需引入任何AWS相关依赖。
内容的提问来源于stack exchange,提问作者Orlando Alexander
相关产品推荐
相关产品推荐

