Bootstrap Fileinput не отправляет файл снова при второй загрузке

Когда я загружаю файл с помощью Krajees Bootstrap Fileinput, я выполняю проверку файла на стороне сервера. Когда что-то идет не так, я вывожу JSON-объект просто с помощью {error:'Something went wrong'}. Плагин отлично отображает ошибку.

Но затем: когда я снова нажимаю «загрузить» сразу после этого, массив $_FILES в вызываемом PHP-скрипте отправки становится пустым. Это означает, что плагин не отправляет файл снова, даже если он уведомил об ошибке.

Почему плагин загружает файл только один раз, даже если обнаруживает ошибку? Существуют ли какие-либо методы, которые могут «сбросить» «загруженное состояние» файла? (Я загружаю только один файл).

Я уже проверил файловые события, но ни одно из них не привело меня к желаемому результату, вместо этого они как бы уничтожили вся форма загрузки с некоторыми кнопками, которые внезапно отключаются, и так далее.


person Florian Müller    schedule 13.05.2016    source источник
comment
Можете ли вы предоставить демо в plunkr, потому что сайт плагина сейчас не работает   -  person Paresh Gami    schedule 16.05.2016
comment
@PareshGami Я не могу создать фрагмент прямо сейчас, но в основном это именно то, что он должен делать. Однако я также спросил Картика, и он ответил, что в настоящее время это невозможно: github.com/kartik-v/bootstrap-fileinput/issues/637   -  person Florian Müller    schedule 16.05.2016
comment
@FlorianMüller, для тебя это все еще не решено? Я думаю github.com/kartik-v/ bootstrap-fileinput/blob/master/js/ — это место, где вы сможете довольно легко написать свою логику повтора :-)   -  person Angad    schedule 21.05.2016
comment
@Angad, ты подвел меня очень близко к решению, я в нем;) Если хочешь, ответь этим, и я вознагражу репутацию.   -  person Florian Müller    schedule 22.05.2016
comment
@FlorianMüller спасибо! Только что понял, что вчерашнее обновление изменило мою закладку строки для «fnError» на что-то другое. Публикация через минуту ура :)   -  person Angad    schedule 22.05.2016
comment
@Angad, что движение твоего курсора решило проблему :-D   -  person Florian Müller    schedule 22.05.2016


Ответы (2)


Наконец-то я нашел точную точку, где проблема может быть решена:

В строке 1705 в функции updateUploadLog, вызывается функция self.updateStack. Этот вызов просто очищает стек файлов и заставляет более поздний процесс очистить ввод формы. Простое закомментирование этой строки делает свое дело, но только если вы перезагружаетесь после успеха, потому что каким-то образом fnSuccess также вызывается при обнаружении ошибки.

@Angad большое спасибо за ваше решение, запускающее ввод, благодаря этому я нашел место, чтобы снова начать поиск;)

person Florian Müller    schedule 22.05.2016
comment
+1 Я до сих пор не могу смириться с тем, что мой маркер линии приблизился ко второму подходу - именно такие вещи делают компьютерное программирование бесконечно увлекательным - person Angad; 22.05.2016

Я вижу, что проблема Github говорит, что в настоящее время это не поддерживается, но кажется относительно несложным разветвить этот проект и настроить его под свои нужды. Все fnError =, которые вы найдете в Cmd + F поиске внутри fileinput.js, находятся там, где вам нужно искать.

Возьмем, к примеру, здесь: https://github.com/kartik-v/bootstrap-fileinput/blob/d5ed3ee989edbd5d67b8cf4bdadc9f3c18609965/js/fileinput.js#L1897

Это для пакетной загрузки файлов, которая в настоящее время выглядит так:

fnError = function (jqXHR, textStatus, errorThrown) {
    var outData = self._getOutData(jqXHR), errMsg = self._parseError(jqXHR, errorThrown);
    self._showUploadError(errMsg, outData, 'filebatchuploaderror');
    self.uploadFileCount = total - 1;
    if (!self.showPreview) {
        return;
    }
    self._getThumbs().each(function () {
        var $thumb = $(this), key = $thumb.attr('data-fileindex');
        $thumb.removeClass('file-uploading');
        if (self.filestack[key] !== undefined) {
            self._setPreviewError($thumb);
        }
    });
    self._getThumbs().removeClass('file-uploading');
    self._getThumbs(' .kv-file-upload').removeAttr('disabled');
    self._getThumbs(' .kv-file-delete').removeAttr('disabled');
};

Я бы попробовал изменить это на:

fnError = function (jqXHR, textStatus, errorThrown) {
    if (!myError.equals(textStatus)) { // A service-like impl. injection would be sexier
        var outData = self._getOutData(jqXHR), errMsg = self._parseError(jqXHR, errorThrown);
        self._showUploadError(errMsg, outData, 'filebatchuploaderror');
        self.uploadFileCount = total - 1;
        if (!self.showPreview) {
            return;
        }
        self._getThumbs().each(function () {
            var $thumb = $(this), key = $thumb.attr('data-fileindex');
            $thumb.removeClass('file-uploading');
            if (self.filestack[key] !== undefined) {
                self._setPreviewError($thumb);
            }
        });
        self._getThumbs().removeClass('file-uploading');
        self._getThumbs(' .kv-file-upload').removeAttr('disabled');
        self._getThumbs(' .kv-file-delete').removeAttr('disabled');
    } else {
        self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, function() {
            // TODO: Second time failure - handle recursively or differently? :-)
        );
    }
};

Надеюсь это поможет!

person Angad    schedule 22.05.2016
comment
Я решил это немного быстро и грязно (см. Мой ответ ниже), но этот подход также соответствует потребностям, большое спасибо! - person Florian Müller; 22.05.2016