JavaScript 使用 FormData 和 jQuery 的 ajax 上传文件 returns 在 iOS 上没有选择文件时出现错误 500

JavaScript Using FormData and jQuery's ajax for uploading files returns error 500 when no file is selected on iOS

我正在使用 FormData 和 jQuery 的 ajax 来上传表单中的文件。 一切正常,除非 iOS 上没有文件 selected,然后我从 PHP 脚本中得到错误 500。

在 PC 和 Android 上,无论文件是否 selected 都可以正常工作,但在 iOS 上,只有文件 selected 才有效( select 文件不需要它)。 我正在使用最新的 iOS 11.4.1.

这是我在提交表单时调用的代码:

var form = this;
var data = new FormData(form);

var options = {
    url: $(form).attr('action'),
    data: data,
    type: $(form).attr('method'),
    cache: false,
    contentType: false,
    processData: false,
    complete: function(r){
        if(r.status == 200){
            var response = r.responseJSON;

            showErrors(form, response.errors);
            $.each(response.actions, handleAction.bind(form));
        }else{
            showErrors(form, ['Vyskytla sa neočkávaná chyba, skúste znova neskôr']);
        }
    }
};
if(data.fake){
    opts.xhr = function(){
        var xhr = jQuery.ajaxSettings.xhr();
        xhr.send = xhr.sendAsBinary;
        return xhr;
    }
    opts.contentType = 'multipart/form-data;boundary='+data.boundary;
    opts.data = data.toString();
}

$.ajax(options);

有一部分代码打印了来自服务器的响应,这是响应:

{"readyState":4,"responseText":"\n\n\n\n
Internal Server Error

\n
The server encountered an internal error or\nmisconfiguration and was unable to complete\nyour request.

\n
Please contact the server administrator at \n ssl@atlantis.sk to inform them of the time this error occurred,\n and the actions you performed just before this error.

\n
More information about this error may be available\nin the server error log.

\n\n","status":500,"statusText":"Internal Server Error"}

我终于找到了问题的解决方案,它不在服务器端。 看起来 FormData 将 iOS 上的一个空文件对象的数组放入数据变量中,服务器无法处理。

我将 JS 编辑为:

var data = new FormData(form);
$.each($(form).find('input[type="file"]'), function(){
    var name = $(this).attr('name');
    var files = $(this).prop('files');

    if(files.length == 0){
        data.set(name, null);
    }
});