使用Ajax+FormData上传文件至IIS7时被截断至80KB以下的问题
解决IIS7下Ajax+FormData上传文件被截断/仅首次成功的问题
老哥,你遇到的这个问题我之前也帮人排查过,结合你说的「调试模式正常、IIS首次启动能传一次、文件被砍到80KB以下」这几个点,基本可以锁定是IIS的请求限制或者缓存/响应处理的锅,给你整理几个针对性的排查和解决步骤:
1. 先调大IIS的请求长度限制
IIS默认对请求大小有严格限制,这大概率是文件被截断的核心原因:
- 打开IIS管理器,找到你的目标站点,双击请求筛选
- 右侧点击「编辑功能设置」,把最大允许请求长度(单位是KB)拉到足够大,比如设成
102400(也就是100MB),同时把「允许未指定的请求长度」勾选上 - 另外一定要检查站点根目录的
web.config,如果里面有<httpRuntime>节点,要保证maxRequestLength和executionTimeout参数配置到位:
<system.web> <httpRuntime maxRequestLength="102400" executionTimeout="3600" /> </system.web>
⚠️ 注意:maxRequestLength的单位是KB,executionTimeout是请求超时时间(单位秒),别搞混了
2. 排查IIS的压缩/缓存干扰
你说「仅首次运行成功」,这个特征很可能和IIS的动态压缩或者输出缓存有关:
- 打开IIS管理器,找到站点,双击压缩,暂时关掉「启用动态内容压缩」,然后再测试上传——有些情况下压缩模块会乱改FormData的传输结构,导致后续请求失败
- 接着检查输出缓存设置,找到你Ajax请求的上传接口(比如ASHX/ASPX地址),确保没有给这个接口启用缓存,避免IIS返回缓存的错误响应
3. 修正Ajax请求的关键配置
很多人写Ajax上传时会犯两个低级错误,直接导致传输异常:
- 绝对不要手动设置
contentType: "multipart/form-data"!FormData会自动生成带正确boundary的Content-Type,手动设置反而会破坏数据结构 - 必须设置
processData: false,防止jQuery自动把FormData转成普通表单数据,导致文件流被截断
给你贴个正确的Ajax上传示例:
var formData = new FormData(document.getElementById('yourUploadForm')); $.ajax({ url: '/UploadHandler.ashx', // 你的后端处理地址 type: 'POST', data: formData, processData: false, // 必须设为false contentType: false, // 必须设为false,不要手动指定 success: function(res) { console.log('上传搞定!'); }, error: function(xhr, status, err) { console.error('上传炸了:', err); } });
4. 检查后端处理代码的资源泄漏
如果你的后端是ASP.NET的ASHX/ASPX,要确保上传处理逻辑没有用静态变量或者没释放资源,导致首次请求后后续请求崩了:
- 比如在ASHX中,不要把文件流、数据库连接这类资源声明成静态的,每次请求都要重新初始化
- 处理完上传后,一定要手动关闭文件流、释放资源,比如用
using语句包裹流操作:
using (var fs = new FileStream(savePath, FileMode.Create)) { request.Files[0].InputStream.CopyTo(fs); }
5. 开IIS日志查具体错误
如果上面的步骤都没解决,那就开IIS的详细日志抓错误:
- 打开IIS管理器,找到站点,双击日志,设置日志格式为「W3C」,确保勾选
Bytes Sent、Bytes Received、Status、Substatus这些字段 - 上传文件后,去默认日志路径
C:\inetpub\logs\LogFiles里找对应的日志,看有没有4xx/5xx状态码(比如413就是请求实体过大),这能直接帮你定位问题根源
按这个顺序排查,基本能解决你的问题。要是还不行,把你的后端处理代码贴出来,我再帮你抠细节~
内容的提问来源于stack exchange,提问作者欧阳福标
相关产品推荐
相关产品推荐

