jQuery文件上传:无法在Safari 11中上传文件

Vla*_*hny 5 jquery file-upload blueimp

重现Safari 11中的错误的步骤:

  1. 在标题中创建一个带有西里尔字母的文件夹,例如"русский_язык"
  2. 将一些文件添加到该文件夹
  3. 在Safari 11.1浏览器中打开https://blueimp.github.io/jQuery-File-Upload/
  4. 从该文件夹上传文件

实际结果:文件未上传.

为了更好地理解,请观看Safari 11的视频:https://drive.google.com/open?id = 16tU8iBn0U9bUs7u5pM4ZBXmxpfJIv8WV

尝试上传相同的文件,但使用Safari 10.

实际结果:一切都很好,文件上传没有任何问题.

为了更好地理解,请观看Safari 10的视频:https://drive.google.com/open?id = 1IO--Y1RjETAYAucaNyqhM6HZcQdNKDkI

更新28.05.2018 经过crossbrowsertesting.com几个小时的debagging(因为我没有safari)我找到了临时解决方案:在这一行https://github.com/blueimp/jQuery-File-Upload/blob/master/ js/jquery.fileupload.js#L1182需要替换

entries = fileInput.prop('webkitEntries') ||  fileInput.prop('entries')
Run Code Online (Sandbox Code Playgroud)

entries = []
Run Code Online (Sandbox Code Playgroud)

一切都应该有效.

我想这是因为苹果添加到safari实验功能 - FileSystemEntry.有关此功能的更多信息,请访问https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry.

如果entries变量为空,则jquery.fileupload.js将使用经过良好尝试的files属性来获取上传的文件.查看代码https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload.js#L1189了解更多详情

我还向Safari和Sebastian Tschan(该库的作者)报告了一个错误

小智 7

我现在发现了同样的问题.我已经检测到代码片段:jquery.fileupload.js

_handleFileTreeEntry: function (entry, path) {
        var that = this,
            dfd = $.Deferred(),
            errorHandler = function (e) {
                if (e && !e.entry) {
                    e.entry = entry;
                }
                // Since $.when returns immediately if one
                // Deferred is rejected, we use resolve instead.
                // This allows valid files and invalid items
                // to be returned together in one set:
                dfd.resolve([e]);
            },
            successHandler = function (entries) {
                that._handleFileTreeEntries(
                    entries,
                    path + entry.name + '/'
                ).done(function (files) {
                    dfd.resolve(files);
                }).fail(errorHandler);
            },
            readEntries = function () {
                dirReader.readEntries(function (results) {
                    if (!results.length) {
                        successHandler(entries);
                    } else {
                        entries = entries.concat(results);
                        readEntries();
                    }
                }, errorHandler);
            },
            dirReader, entries = [];
        path = path || '';
        if (entry.isFile) {
            if (entry._file) {
                // Workaround for Chrome bug #149735
                entry._file.relativePath = path;
                dfd.resolve(entry._file);
            } else {
                entry.file(function (file) {  // <=== here
                    file.relativePath = path;
                    dfd.resolve(file);
                }, errorHandler);
            }
        } else if (entry.isDirectory) {
            dirReader = entry.createReader();
            readEntries();
        } else {
            // Return an empy list for file system items
            // other than files or directories:
            dfd.resolve([]);
        }
        return dfd.promise();
Run Code Online (Sandbox Code Playgroud)

}

在此函数中,当代码进入条件时

            entry.file(function (file) {
                file.relativePath = path;
                dfd.resolve(file);
            }, errorHandler);
Run Code Online (Sandbox Code Playgroud)

Safari返回errorHandler进行文件函数回调.这里的函数api引用:https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileEntry/file.

它一定是Safari 11的bug.很快我就会报告Apple的错误.在jQuery.fileupload.js中,我想更好的固定方法是使用Safari 11检测UserAgent.但我认为Apple应该解决这个问题.