How to Capture File Upload Errors with RadAsyncUpload Custom Handler
Problem
How to throw errors that will be recognized by the "OnClientFileUploadFailed" handler when using a custom handler.
Description
The server returns a status code of 500 and a message similar to "HTTP Error code is: 500" or something like [HttpWebRequest_WebException_RemoteServer] in args.get_message(). This happens because uncaught exceptions trigger the standard ASP.NET error page mechanism and bury any exception info (if passed) in an HTML page in a response that expects JSON.
Solution
You can work around this by following these steps. You can find attached a small example below the list.
-
Create a custom upload result class that has a field for the exception.
public class CustomErrorAsyncUploadResult : IAsyncUploadResult { public CustomErrorAsyncUploadResult() { } public string CustomError { get; set; } public long ContentLength { get; set; } public string ContentType { get; set; } public string FileName { get; set; } }
-
Catch the exception in the handler and populate the custom field.
public class myHandler : AsyncUploadHandler { protected override IAsyncUploadResult Process(UploadedFile file, HttpContext context, IAsyncUploadConfiguration configuration, string tempFileName) { CustomErrorAsyncUploadResult result = CreateDefaultUploadResult<CustomErrorAsyncUploadResult>(file); try { throw new Exception("file did not validate/upload for <insert reason here>"); } catch (Exception ex) { //for example, remove some information, make sure to add the custom field for the error result.ContentLength = 0; result.ContentType = ""; result.CustomError = ex.Message; } return result; } }
-
Return an imitation of success to the client and handle the OnClientFileUploaded event.
<telerik:RadAsyncUpload runat="server" ID="RadAsyncUpload1" HttpHandlerUrl="~/myHandler.ashx" OnClientFileUploaded="OnClientFileUploaded" OnClientFileUploadFailed="OnClientFileUploadFailed"></telerik:RadAsyncUpload>
-
Check for the presence of an error and if so - invalidate the file row.
function OnClientFileUploaded(sender, args) { var info = args.get_fileInfo(); if (info.CustomError != null) { var row = args.get_row(); sender._updateRowImage(row, 'fail'); sender._updateCancelButton(row); $telerik.$(".ruFileProgressWrap", row).remove(); alert(info.CustomError); } }
-
Handle the OnClientFileUploadFailed event just in case to capture any errors.
function OnClientFileUploadFailed(sender, args) { args.set_handled(true); }
See Also