Dash Uploader部署至Elastic Beanstalk后无法上传超1MB文件
问题根因
该问题和dash-uploader组件本身的max_file_size参数配置无关,核心原因是AWS Elastic Beanstalk Python运行环境默认前置的Nginx反向代理自带上传大小限制:Nginx默认配置中client_max_body_size值为1M,所有体积超过1MB的HTTP请求会直接被Nginx层拦截,根本不会转发到后端的Dash应用,因此会出现本地运行无大小限制、部署到EB后仅能上传1MB以下文件的现象。
另外现有代码还存在两个会影响部署后运行的隐患:
- 注释了
application = app.server,Elastic Beanstalk默认通过application变量识别WSGI应用入口 du.configure_upload(app, r'')传入空路径作为上传目录,EB环境下系统根目录无写入权限,会触发权限报错
修复方案
按以下步骤调整即可解决问题:
- 第一步:添加Nginx配置扩展覆盖默认上传限制
在项目根目录创建.ebextensions隐藏文件夹,在文件夹内新建01_nginx_upload.config配置文件,写入以下内容,将Nginx允许的最大请求体调整为大于组件配置的数值:
files: "/etc/nginx/conf.d/upload_limit.conf": mode: "000644" owner: root group: root content: | # 按需调整大小,此处设置为20M,需大于dash-uploader中配置的max_file_size client_max_body_size 20M;
- 第二步:修正应用代码配置
放开WSGI入口配置,指定具备写入权限的上传目录,修正后的参考代码如下:
import dash_uploader as du import dash from dash import html import os app = dash.Dash(__name__) # 暴露WSGI入口,供Elastic Beanstalk识别加载 application = app.server # 初始化上传目录,确保部署环境下有写入权限 UPLOAD_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "upload_files") os.makedirs(UPLOAD_PATH, exist_ok=True) du.configure_upload(app, UPLOAD_PATH) app.layout = html.Div([ du.Upload( text='Drag and Drop Here', text_completed='Successful Upload of ', id='upload', # 注意:该参数单位为MB,按需调整,需小于Nginx配置的client_max_body_size max_file_size=18, max_files=1, filetypes=['xlsx'], upload_id= 'uploader_id' ), ]) if __name__ == '__main__': # 仅本地调试时执行 app.run_server(debug=True, port=8080)
- 第三步:重新部署应用
将包含.ebextensions文件夹的项目代码重新打包上传到Elastic Beanstalk,等待部署完成后,大于1MB的xlsx文件即可正常上传。
内容的提问来源于stack exchange,提问作者ah2Bwise
相关产品推荐
相关产品推荐

