我正在运行一个基于Symfony 2.8的Web应用程序,该应用程序使用Ajax将一些表单数据发送回控制器。
到目前为止,一切都运行良好,但自从最新的macOS更新至10.13.4版本后,用户开始报告,在Safari中提交表单不再起作用。其他macOS版本和10.13.4上的其他浏览器仍然正常工作,因此似乎是Safari的问题。当然,我已经向苹果公司提交了错误报告,但我不认为我会从那里得到反馈...
我能够确定问题的源头:包含空文件输入的数据提交失败:
// safri_bug.html
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<form name="app_booking" method="post" action="/test/submit.php">
<div><input type="text" id="someValue" name="value"></div>
<div><input id="thefile" type="file" name="file"></div>
</form>
<button id="bSubmit" type="button">Submit</button>
<script>
$(document).ready(function() {
$('#bSubmit').click(function() {
var form = $('form');
var data = new FormData(form[0]);
$.ajax({
url : '/submit.php',
type : 'POST',
data : data,
contentType: false,
processData: false,
context : this,
success : function(response) {
alert('success: ' + response);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error: ' + xhr.responseText + ' - ' + thrownError);
}
});
});
});
</script>
</body>
</html>
// submit.php
<?php
echo "OK";
结果
- 在所有测试的浏览器和平台上,提交表单都正常工作,但在macOS 10.13.4中的Safari上不行。
- 在macOS 10.13.4的Safari中:
- 如果没有选择任何文件: Ajax请求运行约20秒钟(内置超时?),然后返回一个空的成功响应。
submit.php
没有被调用。 - 如果已选择文件:一切都正常...
- 如果没有选择任何文件: Ajax请求运行约20秒钟(内置超时?),然后返回一个空的成功响应。
因此,这似乎是最新Safari更新中的错误?还是我的代码有问题?
有什么想法可以防止这个错误吗?