0

У меня возникли проблемы с получением сообщения об ошибке с моего обработчика удаления файла. Я не уверен, но похоже, что удаление по-разному обрабатывается при загрузке.fine uploader delete пользовательское сообщение об ошибке не возвращается

Из документов:

You may return any response you like, as the XMLHttpRequest object will be passed to your onDeleteComplete handler for further examination. However, the response code you return is important to Fine Uploader, as it uses this to determine if the delete has succeeded or not. The following response codes indicate success for this specific request: 200, 202, and 204. Any other response code indicates a failure.

В моем обработчиком сервера для удаления У меня есть это, чтобы поймать ошибку и отправить обратно ответ на 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 в onError callback.

Если я не задал код состояния ответа, по умолчанию он имеет значение ОК и ошибка не возникает.

Я посмотрел на примере кода для 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 с сообщением об ошибке. Но я не могу работать в этом коде, какой статус ответа отправляется обратно.

Update 1: Вот это JS на клиенте, чтобы обработчик ответа сервера:

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

Итак, я делаю что-то не так?

Update 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 не имеет параметра для возврата ошибки.

+0

«Обработчик», который вы опубликовали, не похож на JavaScript. Включите в свой вопрос свой обработчик onDeleteComplete. –

+0

Я добавил JavaScript в OnError.Но ваш комментарий заставляет меня понять, что проблема заключается в том, что я должен обрабатывать ошибку в onDeleteComplete, а не в вызове onError. Казалось логичным, что onError будет вызван, а onDeleteComplete будет вызван только удалением. Наверное, нет? –

+1

Как указано в документации, будет вызван обратный вызов 'onDeleteComplete', когда операция удаления завершится. Если бы он был строго призван к успеху, он был бы назван 'onDeleteSuccess'. Такое поведение согласуется с остальной частью API, такой как обратный вызов 'onComplete'. –

ответ

0

Я не уверен, что это только я, но я нашел это запутанным и непоследовательным.

Для загрузки вы можете сделать это:

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

Что это означает, что ваш сервер может отправить обратно сообщение об ошибке пользовательского ответа и это будет отображаться ниже файл в случае ошибки.

Так что мой C# код сервера Нэнси делает это по ошибке:

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(); 

       } 

      } 
     }, 

UPDATE: Ну это неудобно. Я поднял это как ошибку, и, оказывается, это был мой код. Это демонстрация и напоминание мне о подводных камнях javascript. Id»смотрел на этот код в течение некоторого времени:

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

Это было только тогда, когда Рэй посмотрел на мое сообщение об ошибке, что он заметил очевидную ошибку. Моя переменная функции была вызвана xhr, но мой код искал xhrOrXdr. Я просто этого не видел. И поскольку это javascript, в консоли не было жалоб. Я использую кодирование в C# с помощью Resharper, где это невозможно. Ни Решарпер, ни VS intellisense не смогли меня предупредить.

Таким образом, ошибка была моей ошибкой, и обратный вызов onDelete работает, как описано.

Это учебный процесс.

+0

Похоже, вы запрашиваете изменение или новую функцию. Лучший способ получить это в библиотеке - открыть запрос на перенос с изменением кода. В противном случае открытие запроса функции в репозитории github выполняется. –

+0

Спасибо Рей. Я посмотрю что я могу сделать. Просто обновил свой ответ с окончательным решением. –

+0

"Когда isError = true, объект xhr равен null" Это звучит как ошибка для меня. Если вы напишите один, я обязательно буду изучать его дальше. –

Смежные вопросы