重现Safari 11中的错误的步骤:
实际结果:文件未上传。
为了更好地理解,请观看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')
到
entries = []
一切都应该有效。
我猜它发生了因为苹果添加到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(该图书馆的作者)报告了一个错误
答案 0 :(得分: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();
}
在此函数中,当代码进入条件
时 entry.file(function (file) {
file.relativePath = path;
dfd.resolve(file);
}, errorHandler);
Safari返回errorHandler进行文件函数回调。这里的函数api引用:https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileEntry/file。
一定是Safari 11的错误。很快我就会报告Apple的错误。 在jQuery.fileupload.js中,我想更好的固定方法是使用Safari 11检测UserAgent。但我认为Apple应该解决这个问题。
答案 1 :(得分:0)
我使用包含日文字符的文件夹名称重现了相同的错误,并将NotFoundError: Path does not exist
here与@Stevenhong's answer(macOS 10.13.4和Safari 11.1)相同。
当我使用Safari Technology Preview Release 58时,我成功上传了相同的文件!