Bootstrap Fileinput 不会在第二次上传时再次发送文件
Bootstrap Fileinput does not send file again on second upload
当我使用 Krajees Bootstrap Fileinput 上传文件时,我会对文件执行服务器端验证。当出现问题时,我只用 {error:'Something went wrong'}
输出一个 JSON-Object。插件完美显示错误。
但随后:当我再次按下 "upload" 时,调用的提交 PHP 脚本中的 $_FILES
数组为空。这意味着,即使已通知发生错误,插件也不会再次发送文件。
为什么插件检测到错误也只上传一次文件?有什么方法可以"reset"文件的"uploaded state"吗? (我只上传一个文件)。
我已经检查了 file events,但是 none 给我带来了我想要的结果,相反,他们破坏了整个上传表单,某些按钮突然被禁用等等。
终于找到了解决问题的确切点:
在 line 1705 in the function updateUploadLog 上,函数 self.updateStack
被调用。此调用只是清除文件堆栈并导致后续进程清空表单输入。简单地注释掉这一行就可以了,但前提是你在成功后重新加载,因为不知何故 fnSuccess
在发现错误时也会被调用。
@Angad非常感谢您提供触发输入的解决方案,多亏了它我找到了一个可以重新开始搜索的地方;)
我看到 Github Issue 说这目前不受支持,但是分叉这个项目并根据您的需要调整它似乎相对简单。您将在 fileinput.js
中的 Cmd + F
搜索中找到的所有 fnError =
都是您需要查找的地方。
这适用于当前看起来像这样的批处理文件上传:
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? :-)
);
}
};
希望对您有所帮助!
当我使用 Krajees Bootstrap Fileinput 上传文件时,我会对文件执行服务器端验证。当出现问题时,我只用 {error:'Something went wrong'}
输出一个 JSON-Object。插件完美显示错误。
但随后:当我再次按下 "upload" 时,调用的提交 PHP 脚本中的 $_FILES
数组为空。这意味着,即使已通知发生错误,插件也不会再次发送文件。
为什么插件检测到错误也只上传一次文件?有什么方法可以"reset"文件的"uploaded state"吗? (我只上传一个文件)。
我已经检查了 file events,但是 none 给我带来了我想要的结果,相反,他们破坏了整个上传表单,某些按钮突然被禁用等等。
终于找到了解决问题的确切点:
在 line 1705 in the function updateUploadLog 上,函数 self.updateStack
被调用。此调用只是清除文件堆栈并导致后续进程清空表单输入。简单地注释掉这一行就可以了,但前提是你在成功后重新加载,因为不知何故 fnSuccess
在发现错误时也会被调用。
@Angad非常感谢您提供触发输入的解决方案,多亏了它我找到了一个可以重新开始搜索的地方;)
我看到 Github Issue 说这目前不受支持,但是分叉这个项目并根据您的需要调整它似乎相对简单。您将在 fileinput.js
中的 Cmd + F
搜索中找到的所有 fnError =
都是您需要查找的地方。
这适用于当前看起来像这样的批处理文件上传:
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? :-)
);
}
};
希望对您有所帮助!