Blueimp jQuery 文件上传和我的异常
Blueimp jQuery File Upload and my exception
我想将错误消息传递给 Blueimp jQuery 文件上传插件。我使用 ASP.NET MVC 并在出现某些情况时抛出我自己的异常(即文件不是真实图像,只有图像异常或图像太宽等)。
var file = Request.Files[i];
_service.ImageValidation(file.InputStream);
public void ImageValidation(System.IO.Stream fileStream)
{
Bitmap bmp = null;
try
{
bmp = new Bitmap(fileStream, false);
}
catch
{
throw new NoImageException();
}
if (bmp.Width > bmp.Height && (bmp.Width < 1024 || bmp.Height < 768))
throw new ImageDimensionTooSmall();
if ((bmp.Width <= bmp.Height) && (bmp.Width < 768 || bmp.Height < 1024))
throw new ImageDimensionTooSmall();
fileStream.Position = 0;
}
在客户端,我尝试通过以下方式捕获错误:
$('#fileupload').fileupload({
url: '/SmartphonePhotographer/ManageFiles?ResponseID=' + ResponseID,
error: function (e, data) {
alert('error');
}
});
'data' 变量始终具有 'error' 值。 'e' 有很多属性,包括 statusText='Internal server error' 和 responseText(html 页面有例外)。问题 - 我如何在服务器端传递错误消息以在客户端捕获它(也许,有一个 json 格式的错误,但我没有在文档中找到它)
它转到错误事件,因为您在服务器端代码中抛出异常。因此 ajax 调用收到 500 内部错误响应。
您可以做的是 return 一个包含错误消息的 json 响应,而不是抛出异常。
[HttpPost]
public ActionResult SaveImage()
{
if(IsFileNotValid()) //your method to validate the file
{
var customErrors = new List<string> {"File format is not good",
"File size is too bib"};
return Json(new { Status = "error", Errors = customErrors });
}
//Save/Process the image
return Json ( new { Status="success", Message="Uploaded successfully" });
}
并且在 done()
事件中,您可以检查 json 响应并根据需要显示错误消息。
$('#fileupload').fileupload({
url: '/SmartphonePhotographer/ManageFiles?ResponseID=' + ResponseID,
error: function (e, data,txt) {
alert('error' + txt);
}
}).done(function(response){
if(response.Status==="error")
{
$.each(services.Errors, function (a, b) {
alert(b);
});
}
});
使用这种方法,您可以将多个验证错误发送回客户端,客户端可以处理(向用户显示?)它。
MVC 6
在 MVC6 中,您可以 return 直接从 MVC 控制器操作中获得 HttpStatusCode 响应。因此无需自己发送 JSON 回复。
[HttpPost]
public IActionResult SaveImage()
{
var customErrors = new List<string> { "File format is not good",
"File size is too bib" };
return HttpBadRequest(customErrors);
}
这将向调用方发送一个 400 响应,其中包含我们在响应中传递的数据(错误列表)。因此,您可以访问 error
事件的错误 xHr 对象的响应JSON 属性 以获取它
error: function (a, b, c) {
$.each(a.responseJSON, function (a, b) {
alert(b);
});
}
我同意你的问题是你抛出异常而不是 return 控制响应。大多数框架在 400x 或 500x 中查找状态代码。所以你想要 return 一个友好的 json 对象和这些范围内的状态代码。如果这样做,错误块中的数据对象将是您 return 编辑的内容。
MVC 土地:
//get a reference to request and use the below.
return this.Request.CreateResponse(HttpStatusCode.BadRequest, "Your message here");
网页Api2
使用 IHttpActionResult
和 return BadRequest("My error message");
如果您这样做,它会将您的状态代码和 return 响应设置为数据。
我想将错误消息传递给 Blueimp jQuery 文件上传插件。我使用 ASP.NET MVC 并在出现某些情况时抛出我自己的异常(即文件不是真实图像,只有图像异常或图像太宽等)。
var file = Request.Files[i];
_service.ImageValidation(file.InputStream);
public void ImageValidation(System.IO.Stream fileStream)
{
Bitmap bmp = null;
try
{
bmp = new Bitmap(fileStream, false);
}
catch
{
throw new NoImageException();
}
if (bmp.Width > bmp.Height && (bmp.Width < 1024 || bmp.Height < 768))
throw new ImageDimensionTooSmall();
if ((bmp.Width <= bmp.Height) && (bmp.Width < 768 || bmp.Height < 1024))
throw new ImageDimensionTooSmall();
fileStream.Position = 0;
}
在客户端,我尝试通过以下方式捕获错误:
$('#fileupload').fileupload({
url: '/SmartphonePhotographer/ManageFiles?ResponseID=' + ResponseID,
error: function (e, data) {
alert('error');
}
});
'data' 变量始终具有 'error' 值。 'e' 有很多属性,包括 statusText='Internal server error' 和 responseText(html 页面有例外)。问题 - 我如何在服务器端传递错误消息以在客户端捕获它(也许,有一个 json 格式的错误,但我没有在文档中找到它)
它转到错误事件,因为您在服务器端代码中抛出异常。因此 ajax 调用收到 500 内部错误响应。
您可以做的是 return 一个包含错误消息的 json 响应,而不是抛出异常。
[HttpPost]
public ActionResult SaveImage()
{
if(IsFileNotValid()) //your method to validate the file
{
var customErrors = new List<string> {"File format is not good",
"File size is too bib"};
return Json(new { Status = "error", Errors = customErrors });
}
//Save/Process the image
return Json ( new { Status="success", Message="Uploaded successfully" });
}
并且在 done()
事件中,您可以检查 json 响应并根据需要显示错误消息。
$('#fileupload').fileupload({
url: '/SmartphonePhotographer/ManageFiles?ResponseID=' + ResponseID,
error: function (e, data,txt) {
alert('error' + txt);
}
}).done(function(response){
if(response.Status==="error")
{
$.each(services.Errors, function (a, b) {
alert(b);
});
}
});
使用这种方法,您可以将多个验证错误发送回客户端,客户端可以处理(向用户显示?)它。
MVC 6
在 MVC6 中,您可以 return 直接从 MVC 控制器操作中获得 HttpStatusCode 响应。因此无需自己发送 JSON 回复。
[HttpPost]
public IActionResult SaveImage()
{
var customErrors = new List<string> { "File format is not good",
"File size is too bib" };
return HttpBadRequest(customErrors);
}
这将向调用方发送一个 400 响应,其中包含我们在响应中传递的数据(错误列表)。因此,您可以访问 error
事件的错误 xHr 对象的响应JSON 属性 以获取它
error: function (a, b, c) {
$.each(a.responseJSON, function (a, b) {
alert(b);
});
}
我同意你的问题是你抛出异常而不是 return 控制响应。大多数框架在 400x 或 500x 中查找状态代码。所以你想要 return 一个友好的 json 对象和这些范围内的状态代码。如果这样做,错误块中的数据对象将是您 return 编辑的内容。
MVC 土地:
//get a reference to request and use the below.
return this.Request.CreateResponse(HttpStatusCode.BadRequest, "Your message here");
网页Api2
使用 IHttpActionResult
和 return BadRequest("My error message");
如果您这样做,它会将您的状态代码和 return 响应设置为数据。