Загрузка файла jQuery: невозможно загрузить файл в Safari 11

Действия по воспроизведению ошибки в Safari 11:

  1. Создайте папку с кириллическими буквами в названии, например "русский_язык"
  2. Добавьте несколько файлов в папку
  3. Откройте https://blueimp.github.io/jQuery-File-Upload/ в Браузер Сафари 11.1
  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 (потому что у меня нет сафари) я нашел временное решение: в этой строке https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload.js#L1182 необходимо заменить

entries = fileInput.prop('webkitEntries') ||  fileInput.prop('entries')

to

entries = []

И все должно работать.

Я предполагаю, что это произошло потому, что Apple добавила в сафари экспериментальную функцию - 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 и Себастьяну Чану (автору этой библиотеки)


person Vladimir Kalyuzhny    schedule 19.04.2018    source источник
comment
Я не думаю, что сообщение об ошибке здесь помогает   -  person Carsten Løvbo Andersen    schedule 19.04.2018
comment
@CarstenLøvboAndersen, может быть. но раздел Issue закрыт в репозитории github.com/blueimp/jQuery-File-Upload   -  person Vladimir Kalyuzhny    schedule 19.04.2018
comment
Решение, которое вы посоветовали здесь, не работает для меня :( Есть ли новости об устранении этой проблемы?   -  person Dmitry    schedule 26.06.2018
comment
@Dmitry, это должно работать. Что именно вы делаете и что не работает?   -  person Vladimir Kalyuzhny    schedule 02.07.2018
comment
@VladimirKalyuzhny Здравствуйте, я сделал это joxi.ru/RmzqpEYC0qpGqr , но все еще не могу загрузить файл в Safari 11 из папки русские буквы   -  person Dmitry    schedule 05.07.2018
comment
@VladimirKalyuzhny Я перепроверил сайт и очистил кеш, и похоже, что ваше решение теперь работает. Спасибо! :)   -  person Dmitry    schedule 05.07.2018
comment
@Дмитрий, рад это слышать   -  person Vladimir Kalyuzhny    schedule 06.07.2018
comment
PR открыт - github.com/blueimp/jQuery-File-Upload/pull/3512 - давайте решать вместе.   -  person psmyrdek    schedule 20.07.2018


Ответы (2)


Я нашел ту же проблему сейчас. Я уже обнаружил, что фрагмент кода: 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 я предполагаю, что лучший фиксированный метод — обнаружение UserAgent с помощью Safari 11. Но я думаю, что Apple должна решить эту проблему.

person Stevenhong    schedule 27.04.2018
comment
Самое смешное, что то же самое поведение, но целью является папка на рабочем столе, это полностью работает. мне хреново! - person Stevenhong; 27.04.2018
comment
Стивенхонг, я обновил свой пост. Добавлено мое временное решение, как исправить эту ошибку - person Vladimir Kalyuzhny; 28.04.2018
comment
Я сообщаю об ошибке в Apple с помощью bugreport.apple.com/web/?problemID=39969255 - person Stevenhong; 04.05.2018

Я воспроизвел ту же ошибку с именем папки, содержащим японские символы, и поймал NotFoundError: Path does not exist здесь то же, что и @Stevenhong answer (macOS 10.13.4 и Safari 11.1) .

Мне удалось загрузить те же файлы, когда я использую Safari Technology Preview Release 58!

person Kazuhiro Miyata    schedule 11.06.2018