IIS部署Django使用blueimp分块上传返回500内部错误如何解决
问题原因及解决方案
Reached the end of the file.(0x80070026)错误本质是IIS接收POST请求体时,未读取到预期长度的内容就提前终止,结合本地测试正常、仅IIS部署报错的特性,按以下优先级排查修复即可:
1 调整IIS上传大小限制
IIS默认有上传大小阈值,超过后会直接截断请求触发该错误:
- 打开IIS管理器,定位到对应站点,进入【请求筛选】功能
- 点击右侧操作栏的【编辑功能设置】,修改【允许的最大内容长度】为大于你最大上传文件的数值(单位为字节,例如1G对应填写1073741824)
- 同步修改站点根目录下web.config的配置,确保两个阈值匹配:
<configuration> <system.web> <!-- 单位为KB,1G对应1048576 --> <httpRuntime maxRequestLength="1048576" executionTimeout="3600" /> </system.web> <system.webServer> <security> <requestFiltering> <!-- 单位为字节,1G对应1073741824 --> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security> </system.webServer> </configuration>
2 关闭IIS请求缓冲
IIS默认会缓冲完整请求后再转发给后端Django,分块上传场景下缓冲逻辑和分块传输逻辑冲突会导致读取异常:
- 如果是用FastCGI部署Django:打开站点的【处理程序映射】,找到对应FastCGI处理程序,点击【编辑】→【请求限制】→【映射】,取消勾选【调用处理程序前将文件缓冲到磁盘】
- 如果是用HttpPlatformHandler托管Django:在web.config的httpPlatform节点添加
requestBufferEnable="false"配置:
<httpPlatform processPath="你的Python路径\python.exe" arguments="你的项目路径\manage.py runserver %HTTP_PLATFORM_PORT%" requestBufferEnable="false" stdoutLogEnabled="false" startupTimeLimit="3600">
3 修正前端URL拼接逻辑
你当前用window.location.href + 'api/chunked_upload/'拼接上传地址,如果当前页面URL末尾不带/,会生成类似xxx.com/pageapi/chunked_upload/的错误路径,IIS会先返回301重定向,重定向后的请求会丢失POST体触发报错。
修改URL拼接逻辑即可:
// 方案1:适配任意部署路径的通用写法 url: window.location.origin + window.location.pathname + (window.location.pathname.endsWith('/') ? '' : '/') + 'api/chunked_upload/' // 方案2:如果Django部署在站点根路径,直接写固定相对路径 // url: '/api/chunked_upload/'
4 排查Django层异常
如果以上配置修改后仍报错,临时开启Django DEBUG模式,或配置日志输出到本地文件,查看Django侧的异常栈信息,排查是否是模型写入、权限校验等业务层逻辑报错。
内容的提问来源于stack exchange,提问作者Bugsy
相关产品推荐
相关产品推荐

