c# - tag - La forma recomendada de verificar el tamaño del archivo al cargar
tag c# (10)
En IE, puedes hacerlo con JS y ActiveX :
function A()
{
var oas = new ActiveXObject("Scripting.FileSystemObject");
var d = document.a.b.value;
var e = oas.getFile(d);
var f = e.size;
alert(f + " bytes");
}
</script>
</head>
<body>
<form name="a">
<input type="file" name="b">
<input type="button" name="c" value="SIZE" onClick="A();">
</form>
</body>
</html>
Estoy trabajando en una aplicación web que admite la carga de archivos. Ya estoy familiarizado con el tamaño del servidor, pero quería verificar el tamaño del archivo en el lado del cliente.
Sé que es una limitación del navegador que no podemos acceder a las propiedades del archivo por razones de seguridad. Así que probé el componente swfupload y uploadify. Ambos son buenos y sirven las necesidades.
Pero la limitación depende de flash, por lo que si mi usuario final no está instalado, entonces terminaría en un problema. Pedirles que instalen flash es otra cosa, pero es un portal web y la base de usuarios es enorme. Así que no me gusta la idea de pedirles que instalen flash.
Hoy encontré la funcionalidad de carga de archivos en gmail. Y probado esto en el navegador (IE) sin tener flash instalado. Lo que encontré fue interesante. Si subes un archivo grande, hicieron una devolución de datos y, al devolver el mensaje de inmediato, el tamaño del archivo es demasiado grande.
¿Cómo es posible, cómo pueden encontrar el tamaño del archivo sin descargar todo el contenido? Creo que esto debe hacerse leyendo la información del encabezado HTTP. estoy en lo correcto?
Esta es la funcionalidad exacta que quería implementar. Si el flash ya está instalado, puedo usar uploadify para verificar el tamaño; de lo contrario, podré implementarlo nunca-heardof-technique-used-by-google.
¿alguien me puede recomendar cómo hacer esto?
Alguien se enfrentó a los problemas similares antes, ¿qué has hecho?
Actualizar:
Carga de Gmail con flash instalado en FF
sin flash en IE
No he probado esto, pero ¿no hay un encabezado "Content-Length" en la solicitud? Incluirá más que solo el archivo que se está cargando, pero puede usarlo como punto de referencia para determinar si el POST es demasiado grande para manejarlo.
Puede echar un vistazo a File API, que es un borrador para HTML 5. Aquí hay un buen artículo . Eso es lo que usa Gmail si el navegador lo admite, por supuesto. Pero no hay forma de garantizar que esto funcione en todos los navegadores.
Comenzaré diciendo que no he podido generar una copia de trabajo y la mayor parte de esto lo entiendo a partir de la lectura y la breve experiencia. Dicho esto, tal vez podrías explorarlo un poco más y / o aclararme si estoy equivocado. Lo principal apunta a la idea de la forma clásica con una entrada oculta llamada MAX_FILE_SIZE ... En PHP / Apache, el servidor se detendrá si la carga es mayor que MAX_FILE_SIZE (vea la última publicación desde aquí ). En el aspecto de PHP, la matriz $ _FILES arrojará un código de error (que se puede ver aquí ). Tome nota de UPLOAD_ERR_FORM_SIZE .
Para poner todo esto junto, podría tener JavaScript cargar el archivo dentro de un IFrame y obtener el resultado. Si el servidor escupe un mensaje de error (que, en esta teoría, sería bastante rápido), JavaScript simplemente puede alertar al usuario. De lo contrario, podemos suponer que el archivo se cargó correctamente. Ahora intentar dar sentido al código de Google es casi imposible; un escaneo rápido de HTML es todo lo que puedo hacer y no sirvió de nada ... De hecho, tienen campos de entrada ocultos, pero ninguno con MAX_FILE_SIZE como nombre. Son mucho más cortos y la mayoría no parecen tener valores. Pero, creo que esto podría ser posible. Pensamientos a nadie?
Quién sabe, tal vez el gran servidor web de Google está construido con la capacidad de cortar cargas al instante. ¡Gracias por su atención!
Creo que la carga de archivos se basa en RFC 1867 , aunque HTML5 reemplaza todo esto. Puede volver a implementar perfectamente este RFC, el lado del servidor, y verificar el tamaño de la corriente entrante acumulada.
En los casos más generales, no creo que pueda confiar de forma segura en la longitud del contenido, ya que puede no representar el tamaño del archivo, sino solo el tamaño de un fragmento.
Lol ofc puedes hacerlo, es solo un poco de trabajo duro, si buscas "uploadbar flash" en lugar de usar los datos que recuperas para crear un cargador, puedes usarlo para pasarlo o compararlo o hacer lo que quieras. encontré que parecía bastante bueno es este, no usa flash necesariamente pero puedes usarlo para lograr lo mismo http://www.plupload.com altamente configurable ps, podrías forzarlo a usar simplemente flash si realmente te gusta
Después de mucha búsqueda encontré que podemos usar maxAllowedContentLength para limitar el tamaño de carga en las aplicaciones ASP.Net. Recuerde que esta configuración solo funciona en IIS 7 o superior.
Como esto se maneja en el nivel IIS, no necesitamos manejar nada en el código del servidor. Si el límite de tamaño excede, devolverá el código de error 404.13 . Por lo tanto, puede verificar fácilmente el código en el lado del cliente para determinar el problema.
Esto es lo que he hecho para manejar los archivos grandes si el flash no está instalado en la máquina del cliente.
Espero que esto pueda ayudar a alguien.
Para obtener más información acerca de esta configuración, lea esto
Es posible determinar el tamaño del archivo que se está cargando incluso antes de que el archivo cargado se haya transferido por completo. Incluso cuando se usa Internet Explorer. ¡Usando el encabezado de longitud de contenido de HTTP!
En el mundo de Java:
En primer lugar, si maneja la solicitud que llega al servidor en el primer servlet / filtro / controlador antes de que cualquier subproceso anterior se acumule con ella, podrá obtener el tamaño total del archivo en el encabezado de longitud del contenido (solicitud. getContentLength ()).
en segundo lugar, eche un vistazo a la implementación de Ajax que demuestra que es posible: http://www.ajaxfilebrowser.com/
Puede obtener el siguiente código para obtener la función de Gmail:
<html>
<head>
<script type="text/javascript">
$(function()
{
$(''#btnSubmit'').click(function()
{
if (typeof (input.files) != ''undefined'') { // this will work in firefox,chrome.
if (input.files[0].fileSize > MAX_FILE_SIZE) {
alert("file size exceeded");
return false;
}
}
else
{
//this approach will work for ie 8.
$(''iframe'').bind(''load''),function()
{
try
{
var text = $(''iframe'')[0].contentWindow.document.body ? $(''iframe'')[0].contentWindow.document.body.innerHTML : null;
}
catch(e)
{
alert(''Server error occurred'');
}
}
});
});
});
</script>
</head>
<body>
<form method="post" enctype="multipart/form-data" name="fileUpload" action="Default.aspx" target="responseFrame">
<input type="file"/>
<input type="submit" value="upload" id="btnSubmit"/>
</form>
<iframe src='''' name=''responseFrame'' id=''responseFrame'' style=''width:0px;height:0px;border:0;''></iframe>
</body>
</html>
Espero que esto ayude.
De hecho, hice esta misma pregunta (más o menos) hace unos días y la respuesta general parece ser: no se puede hacer.
A modo de referencia: asegúrese de que el tamaño del archivo cargado sea menor que maxRequestLength antes de que se cargue.