1

我的应用程序是用 Perl 5.14.2 编写的。我处理多部分/表单数据

use CGI;
$query = new CGI;

几周后,此过程在特定 Apple 设备上调用 Apache 级别的超时:

(70007)指定的超时已过期:读取请求实体数据时出错

调用超时错误的苹果设备都有Applewebkit/605共同点。这主要是 Mac 上的 Safari 浏览器版本 11。

表单数据通过以下方式发送:

var fData = new FormData($('#myForm')[0]);

jQuery.ajax({
    url: '/urladdress',
    data: fData,
    cache: false,
    dataType: 'html',
    contentType: false,
    processData: false,
    type: 'POST'
});

我发现当表单数据包含空的“文件”类型的元素(未提供文件)时,就会出现问题。问题不依赖于 CGI 或 CGI::Simple 的使用。即使只是尝试获取 STDIN 缓冲区也会引发错误。

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

解决方法是在分配表单数据之前删除 <form> 的空文件元素,从而删除表单数据:

$('#myForm').find("input[type='file']").each(function(){
    if ($(this).get(0).files.length === 0) {$(this).remove();}
});
var fData = new FormData($('#myForm')[0]);
...

自 2018 年 4 月 11 日以来,该错误似乎已为人所知
https://bugs.webkit.org/show_bug.cgi?id=184490

似乎已经在 Stackoverflow
Safari 11.1 上报告过:当 input[type=file] 为空时,ajax/XHR 表单提交失败

4

0 回答 0