0

我无法从我的文件删除处理程序返回自定义错误消息。我不确定,但看起来删除的处理方式与上传不同。

从文档:

您可以返回任何您喜欢的响应,因为 XMLHttpRequest 对象将被传递给您的 onDeleteComplete 处理程序以供进一步检查。但是,您返回的响应代码对 Fine Uploader 很重要,因为它使用它来确定删除是否成功。以下响应代码表示此特定请求的成功:200、202 和 204。任何其他响应代码都表示失败。

在我的删除服务器处理程序中,我有这个来捕获错误并将响应发送回 FineUploader。

catch (Exception ex)
{
    //const string json = "{\"success\":false}";
    const string json = "{\"success\":false,\"error\":\"THIS IS THE ERROR\"}";
    //const string json = "{\"error\":\" HERE IS THE ERROR! \"}";
    var response = (Response)json;
    response.ContentType = "text/plain";
    //response.StatusCode = HttpStatusCode.InternalServerError; 
    return response;
}

我已经尝试将{"success":false}错误连同错误一起发回,只是{"success":false}错误。我已经检查过 json 是否有效。然而,它似乎什么都不做。对 FineUploader 来说重要的是 response.StatusCode。如果我发送失败响应代码,FineUploader 会识别错误并显示该代码的消息。它还会在onError回调中以errorReason的形式返回。

如果我没有设置响应状态代码,它默认为 OK 并且不会引发错误。

我查看了 php 的示例代码,并在删除处理程序中看到了这一点:

if (is_dir($target)){
    $this->removeDir($target);
    return array("success" => true, "uuid" => $uuid);
} else {
    return array("success" => false,
        "error" => "File not found! Unable to delete.".$url,
        "path" => $uuid
    );
}

显然,该代码正在发回"success":fail带有自定义错误消息的 a。但是我无法在该代码中计算出正在发回的响应状态。

更新 1:这是客户端上用于处理服务器响应的 js:

callbacks: {
    onError: function(id, name, errorReason, xhrOrXdr) {
        alert(qq.format("Error on file number {} - {}.  Reason: {}", id, name, errorReason));
        console.log(errorReason);
}

那么,我做错了吗?

更新 2:

好的,我看过了onDeleteComplete,我的客户端代码现在看起来像这样:

 callbacks: {
    onDeleteComplete: function(id, xhr, isError) {
        alert("onDeleteComplete => id is:" + id + " Is error?:" + isError);
    },
    onError: function(id, name, errorReason, xhrOrXdr) {
        alert(qq.format("onError => Error on file number {} - {}.  Reason: {}", id, name, errorReason));
        console.log(errorReason);
    },

现在,当我在浏览器中删除文件时,我onError首先收到警报,然后是onDeleteComplete. 在这两种情况下,我都找不到任何方法来显示我想从服务器处理程序发回的错误消息。onError似乎总是只显示 HttpStatus 错误消息,而不是我的 json 响应中定义的错误消息。onDeleteComplete没有参数可以恢复错误。

4

1 回答 1

0

我不确定是不是只有我,但我发现这令人困惑和不一致。

对于上传,您可以这样做:

failedUploadTextDisplay: {
        mode: "custom",
        responseProperty: "errorMessage"
    },

这意味着您的服务器可以发回自定义响应错误,并且在发生错误时将显示在文件下方。

所以我的 C# Nancy 服务器代码在错误时执行此操作:

catch (Exception ex)
            {
                FormResponse.success = false;
                FormResponse.errorMessage = ex.Message;
                return Response.AsJson(FormResponse).WithStatusCode(HttpStatusCode.BadRequest);
            }

这会发送回如下所示的 json:

{"errorMessage":"A file with that name already exists and cannot be overwritten!","success":false}

FineUploader 然后在文件下显示此消息,如下所示:

在此处输入图像描述

这是伟大的。但是对于文件删除,我找不到这样的功能。

因此,对于意外的删除失败,我将不得不找到一种解决方法:

我有我认为可以用来获取错误的 onDeleteComplete 回调:

onDeleteComplete: function(id, xhr, isError) {
            if (isError) {
                console.log("Error in delete!!");
                if (typeof xhrOrXdr != 'undefined' && xhrOrXdr != null) {
                    console.log("resp text=" + xhrOrXdr.responseText);
                    var t = JSON.parse(xhrOrXdr.responseText);
                    console.log(t['errorMessage']);

                }
            }

但这不起作用,因为当 isError = true 时 xhr 对象为空。所以没有办法在 onDeleteComplete 中得到错误。

如果 FineUploader 有这样的东西会很好:

failedDeleteTextDisplay: {
mode: "custom",
responseProperty: "errorMessage"

},

但事实并非如此。所以看起来我必须在 OnError 回调中处理删除错误。但是因为我不知道它是哪种动作。删除或上传,然后我将不得不在我的 json 中发送另一个参数来处理切换,因为我只需要更改删除失败的默认错误消息。

所以,我现在的最终解决方法是这个。onError 处理程序处理删除和上传错误。我的服务器现在在 json 中发回另一个名为“actionType”的参数。这可以是“删除”或“上传”。如果是删除操作错误,则某些 jquery 会隐藏默认错误消息并显示新错误消息。

onError: function(id, name, errorReason, xhrOrXdr) {
            if (typeof xhrOrXdr != 'undefined' && xhrOrXdr != null) {
                var t = JSON.parse(xhrOrXdr.responseText);

                // if the error was result of delete then show the custom                     message on the panel
                if (t["actionType"] === "delete") {
                    $("#CustomError").html("Delete failed: " +  t["errorMessage"] );
                    $("#ErrorContainer").hide();

                }

            }
        },

更新:嗯,这很尴尬。我将此作为错误提出,结果证明是我的代码有问题。这是一个关于 javascript 陷阱的演示和提醒。我一直在看这段代码一段时间:

onDeleteComplete: function(id, xhr, isError) {
            if (isError) {
                console.log("Error in delete!!");
                if (typeof xhrOrXdr != 'undefined' && xhrOrXdr != null) {

只有当 Ray 查看我的错误报告时,他才发现了一个明显的错误。我的函数变量被调用xhr,但我的代码正在寻找xhrOrXdr. 我只是没看到。而且由于它是 javascript,因此控制台中没有任何投诉。我习惯于用 Resharper 在 C# 中编码,而这种事情是不可能的。Resharper 或 VS intellisense 都无法警告我。

所以这个错误是我的错误,onDelete回调按描述工作。

这是一个学习的过程。。

于 2016-05-16T11:18:24.647 回答