Bootstrap Fileinput在第二次上载时不再发送文件

时间:2016-05-13 14:22:22

标签: ajax twitter-bootstrap file-upload asyncfileupload bootstrap-file-upload

当我使用Krajees Bootstrap Fileinput上传文件时,我会对文件执行服务器端验证。当出现问题时,我只用{error:'Something went wrong'}输出一个JSON-Object。插件完美地显示错误。

然后:当我再次按下#34;上传"在此之后,被调用的提交PHP脚本中的$_FILES数组为空。这意味着,即使已通知已发生错误,插件也不会再次发送文件。

为什么插件只会上传文件一次,即使它检测到有错误?有没有什么方法可以重置" "上传状态"的文件? (我只上传了一个文件)。

我已经检查了file events,但没有一个让我达到了预期的结果,相反,他们破坏了整个上传表单,某些按钮突然被禁用等等。

2 个答案:

答案 0 :(得分:3)

我看到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? :-)
        );
    }
};

希望这有帮助!

答案 1 :(得分:2)

我终于找到了问题可以解决的确切点:

line 1705 in the function updateUploadLog上,调用函数self.updateStack。此调用只是清除文件堆栈并导致后续进程清空表单输入。简单地注释掉这一行可以解决问题,但只有在成功后重新加载,因为在找到错误时也会调用fnSuccess

@Angad非常感谢你的解决方案触发输入,多亏了我找到了一个重新开始搜索的地方;)