代码之家  ›  专栏  ›  技术社区  ›  acb1980

上次更新后,Safari(iOS和OS X)上的Ajax文件上传中断

  •  2
  • acb1980  · 技术社区  · 6 年前

    我正在使用jQuery和$。ajax()-用于提交我的表单字段的函数。请求如下所示:

        $.ajax({
            url: url,
            type: method,
            data: formData,
            contentType: false,
            processData: false,
            success: function(data) {
                // do some stuff with data
            },
            timeout: 30000,
            error: function(jqxhr,status,error) {
                console.log(jqxhr);
            }
        });
    

    url、method等变量直接取自表单属性。变量formData是一个formData对象,它保存要发送到服务器的所有数据。

    几年来,这一切都在所有浏览器中运行良好。但是,自上次更新OS X和iOS以来,当表单中存在type=file的输入时,Safari无法处理此请求。问题是,我没有收到任何错误消息,因此错误回调失败,但其中的jqxhr变量没有消息(statusText:“error”,responseText:)。

    您是否知道如何更接近错误消息,以便修复此问题?我已经在Mac OS X上测试了所有其他浏览器,它工作得很好(Safari也做了多年)。

    1 回复  |  直到 6 年前
        1
  •  5
  •   acb1980    6 年前

    正如评论中所述,问题是空文件输入。最简单的解决方案是检查它们并将其从formData对象中删除。我现在用以下代码解决了这个问题,这与aletzo的链接略有不同,但做的是相同的:

        $('input[type=file]',form).each(function() {
            var files = $(this).prop('files');
            if ( files != undefined && files.length <= 0 ) {
                formData.delete($(this).attr('name'));              
            }
        });
    

    谢谢大家的帮助。