【问题标题】:Bootstrap Fileinput does not send file again on second uploadBootstrap Fileinput 在第二次上传时不会再次发送文件
【发布时间】:2016-05-22 21:30:48
【问题描述】:

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

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

为什么插件即使检测到错误也只会上传一次文件?有什么方法可以“重置”文件的“上传状态”吗? (我只上传一个文件)。

我已经检查了file events,但它们都没有给我带来想要的结果,相反,它们破坏了整个上传表单,某些按钮突然被禁用等等。

【问题讨论】:

  • 由于插件站点现在已关闭,您能否在 plunkr 中提供演示
  • @PareshGami 我现在无法创建 sn-p,但基本上这正是它应该做的。不过,我也问过 Kartik,他回答说目前不可能:github.com/kartik-v/bootstrap-fileinput/issues/637
  • @FlorianMüller 你还没有解决这个问题吗?我认为github.com/kartik-v/bootstrap-fileinput/blob/master/js/… 是您应该能够很容易地编写重试逻辑的地方:-)
  • @Angad 你让我非常接近一个解决方案,我支持它;)如果你愿意,回答这个问题,我会奖励声誉。
  • @FlorianMüller 谢谢!刚刚意识到昨晚的更新将我的“fnError”行书签更改为其他内容。发布一分钟欢呼:)

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


【解决方案1】:

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

line 1705 in the function updateUploadLog 上,函数self.updateStack 被调用。此调用只是清除文件堆栈并导致稍后的进程清空表单输入。只需注释掉这一行就可以了,但前提是您在成功后重新加载,因为在发现错误时也会以某种方式调用 fnSuccess

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

【讨论】:

  • +1 我仍然无法克服我的线标记接近第二种方法的事实 - 正是这样的事情使计算机编程变得无穷无尽
【解决方案2】:

我看到 Github 问题说目前不支持此功能,但分叉此项目并根据您的需要调整它似乎相对简单。在fileinput.js 内的Cmd + F 搜索中找到的所有fnError = 都是您需要查找的位置。

以这里为例: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? :-)
        );
    }
};

希望这会有所帮助!

【讨论】:

  • 我解决了它有点快'n'dirtier(见下面我的回答),但这种方法也适合需要,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2010-10-31
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多