ASP.NET: cómo mostrar una página de error al cargar un archivo grande(¿Se excedió la longitud máxima de solicitud?)
file-upload maxrequestlength (6)
Puede verificar la longitud del archivo publicado (FileUpload.PostedFile.ContentLength), para ver si está por debajo del límite o no y simplemente mostrar un mensaje de error amigable si es necesario.
Aplicación capaz de registrar el error en OnError, pero no podemos hacer ningún redireccionamiento para mostrar algo significativo al usuario. ¿Algunas ideas? Sé que podemos establecer maxRequestLength en web.config, pero de todos modos el usuario puede superar este límite y es necesario que se muestren algunos errores normales.
Como dices, puedes configurar maxRequestLength en tu web.config (sobreescribiendo los 4MB predeterminados de tu machine.config) y si se exceden estos límites usualmente recibes un error HTTP 401.1.
Para manejar un error HTTP genérico a nivel de aplicación, puede configurar una sección CustomError en su web.config dentro de la sección system.web:
<system.web>
<customErrors mode=On defaultRedirect=yourCustomErrorPage.aspx />
</system.web>
Cada vez que se muestra el error, el usuario será redirigido a su página de error personalizada.
Si desea una página especializada para cada error, puede hacer algo como:
<system.web>
<customErrors mode="On" defaultRedirect="yourCustomErrorPage.aspx">
<error statusCode="404" redirect="PageNotFound.aspx" />
</customErrors>
</system.web>
Y así.
Alternativamente, podría editar la pestaña CustomErrors de las propiedades de su directorio virtual desde IIS para que apunte a su error al manejar las páginas de su elección.
Lo anterior no parece funcionar para los errores 401.x: este artículo del proyecto de código explica una solución alternativa para un problema que parece ser muy similar: Redirigir a la página personalizada 401
Desafortunadamente, probablemente necesite IIS7 y atrape esto con un manejador personalizado, ya que IIS6 nunca llegará a la etapa donde puede ver el tamaño del archivo. Solo puede saber el tamaño cuando se realiza la carga o si tiene un error.
Este es un problema conocido en ASP.NET. Otra alternativa (coja) es manejar esto antes en la solicitud y quizás usar un cargador basado en flash. John enlaces a varios en el siguiente enlace .
Actualización : Jon Galloway parecía haber profundizado en este problema y parece que un cargador de RIA es la única alternativa sensata, ya que IIS parece que siempre debe tragar el archivo Y LUEGO le dice que es demasiado grande.
Debería poder detectar el error en el controlador Global.asax - OnError (). Pero desafortunadamente, su solicitud inicial habrá finalizado y no podrá presentar la misma página de carga con alguna notificación de error al usuario.
Lo que puede hacer a lo sumo es mostrar una página de error amigable con una cláusula de redireccionamiento simple dentro del controlador OnError () y en esa página tener algún enlace posterior o funcionalidad similar para devolver al usuario a la página donde desencadenó el error en el primer lugar.
Actualizar:
Tuve que implementar un control exacto al subir archivos recientemente y lo que se me ocurrió es la biblioteca SWFUpload , que cumplió totalmente con mis requisitos y también tiene muchas características adicionales. Lo usé junto con el envoltorio jquery proporcionado por Steve Sanderson. Más detalles se pueden encontrar aquí .
El punto es que ese flash es capaz de detectar el tamaño del archivo en el lado del cliente y reaccionar adecuadamente si se cumple este caso. Y creo que esto es exactamente lo que necesitas.
Además, puede implementar la comprobación de detección de flash si desea degradar con gracia el botón de carga nativa0 en caso de que el cliente no tenga instalado flash.
Sergei,
Según la respuesta de JohnIdol, debe configurar una página de error personalizada para el código de estado 413 . p.ej:
<customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
<error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
</customErrors>
Lo sé porque tuve que resolver el mismo problema en un proyecto de cliente, y esta fue la solución que funcionó para mí. Desafortunadamente, fue la única solución que encontré ... no fue posible detectar este problema en particular en el código; por ejemplo, verificar la longitud del archivo publicado como Snomag lo ha sugerido, o detectar un error en global.asax. Al igual que usted, también probé estos otros enfoques antes de llegar a una solución funcional. (De hecho, finalmente encontré esto en algún lugar de la web cuando estaba trabajando en mi problema).
Espero que ayude.
La mejor forma de manejar grandes cargas es utilizar una solución que implemente un HttpModule que dividirá el archivo en fragmentos. Cualquiera de las soluciones pre-laminadas que se encuentran allí debería permitirle limitar el tamaño del archivo. Muchos otros han publicado enlaces a los que están en esta página, así que no me molestaré. Sin embargo, si no quieres molestarte con eso, puedes manejar esto en el evento Global.asax Application_Error de tu aplicación. Si su aplicación es .NET 4.0, inserte este bloque de código:
if (ex.InnerException != null && ex.InnerException.GetType() == typeof(HttpException) && ((HttpException)ex.InnerException).WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
{
//Handle and redirect here, you can use Server.ClearError() and Response.Redirect("FileTooBig.aspx") or whatever you choose
}
Si está ejecutando en un marco anterior, pruebe el código aquí (está en VB, pero es fácil de traducir): http://www.webdeveloper.com/forum/showthread.php?t=52132