精细上传者删除自定义错误消息不回来

时间:2016-04-25 08:17:26

标签: c# handler delete-file fine-uploader custom-error-handling

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

来自文档:

  

您可以返回任何您喜欢的响应,因为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会识别错误并显示该代码的消息。它还会在错误回调中的 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。 但我无法在该代码中解决回复状态的问题。

更新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没有参数可以恢复错误。

1 个答案:

答案 0 :(得分: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然后在这样的文件下显示此消息:

enter image description here

哪个好。但是对于文件删除,我找不到这样的功能。

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

我有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对象为null。 因此无法在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();

                }

            }
        },

更新: 这是令人尴尬的。我把它作为一个bug提出来,结果证明这是我的错误代码。这是一个演示和提醒我关于javascript的陷阱。我一直在看这段代码:

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

只有当Ray看到我的错误报告时,他发现了一个明显的错误。 我的函数变量名为xhr,但我的代码正在寻找xhrOrXdr。 我只是没有看到它。由于它是javascript,控制台中没有任何投诉。我习惯在C#中使用Resharper进行编码,这种情况是不可能的。 Resharper或VS intellisense都没有能够警告我。

所以错误是我的错误,onDelete回调的工作原理如上所述。

这是一个学习过程..