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

iOS 11.3下无文件数据的$.ajax提交纯文本表单异常缓慢问题咨询

解决iOS 11.3+中$.ajax提交无文件的multipart表单慢的问题

我之前也踩过iOS 11.3更新后,Safari处理空文件字段的multipart请求时的诡异延迟坑,给你几个实测有效的解决方案:

方案1:动态切换表单编码类型

当没有文件需要上传时,不用强制用multipart/form-data,改用默认的表单编码类型,这样能直接避开Safari的异常处理逻辑:

$('#chatform').submit(function(e) {
  e.preventDefault();
  const fileInput = $('#pic')[0];
  const hasSelectedFile = fileInput.files.length > 0;
  let requestData;
  let ajaxOpts = {
    url: '你的接口地址',
    type: 'POST',
    success: function(res) {
      // 处理成功回调
    },
    error: function(xhr) {
      // 处理错误回调
    }
  };

  if (hasSelectedFile) {
    // 有文件时用FormData和multipart编码
    requestData = new FormData(this);
    ajaxOpts.processData = false;
    ajaxOpts.contentType = false;
  } else {
    // 无文件时用普通表单序列化
    requestData = $(this).serialize();
    ajaxOpts.contentType = 'application/x-www-form-urlencoded';
  }

  ajaxOpts.data = requestData;
  $.ajax(ajaxOpts);
});

方案2:给空文件字段添加占位Blob

如果你的业务必须保持multipart/form-data编码,可以给未选择文件的字段添加一个空的Blob对象,让Safari能正常构造请求体:

$('#chatform').submit(function(e) {
  e.preventDefault();
  const formData = new FormData(this);
  const fileInput = $('#pic')[0];

  // 当没有选择文件时,追加一个空Blob占位
  if (fileInput.files.length === 0) {
    formData.append('pic', new Blob(), '');
  }

  $.ajax({
    url: '你的接口地址',
    type: 'POST',
    data: formData,
    processData: false,
    contentType: false,
    success: function(res) {
      // 处理成功逻辑
    },
    error: function(xhr) {
      // 处理错误逻辑
    }
  });
});

补充说明

这个问题是iOS 11.3之后Safari的一个特定bug,当表单声明为multipart/form-data但没有实际文件数据时,浏览器在构造请求体时会出现阻塞延迟。上面两个方案都能绕过这个问题,方案1更高效,方案2适合必须保持multipart编码的场景。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:17:39