2010-12-10 22 views
7

Tengo un formulario en una página HTML que un usuario necesita para cargar un archivo que se publica en una página ASPX. En el código subyacente, quiero probar si un archivo se ha cargado realmente.HTTPRequest.Files.Count Nunca es igual a cero

if (Request.Files.Count > 0) 
{ 
    DoStuff(Request.Files[0]); 
} 
else 
{ 
    throw new Exception("A CSV file must be selected for upload."); 
} 

Nunca llegaré al otro. ¿Es así como opera ASP.NET? Si tengo un elemento de entrada de tipo archivo, ¿siempre va a subir un "archivo", incluso si no se selecciona uno?

¿Cuál es la forma correcta de hacerlo? ¿Tal vez esto?

if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) 
{ 
    DoStuff(Request.Files[0]); 
} 
else 
{ 
    throw new Exception("A CSV file must be selected for upload."); 
} 

Respuesta

6

Tal vez sólo esto va a hacer:

if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) 
{ 
    DoStuff(Request.Files[0]); 
} 
else 
{ 
    throw new Exception("A CSV file must be selected for upload."); 
} 
+0

Desafortunadamente, si accede a la propiedad Archivos, no puede llamar posteriormente a Request.GetBufferlessInputStream: "Este método o propiedad no es compatible después de que se haya invocado HttpRequest.Form, Files, InputStream o BinaryRead" – dudeNumber4

+0

@ dudeNumber4 Entonces, ¿la respuesta seleccionada es incorrecta? No tengo Visual Studio en este equipo ahora mismo para investigar. – kzh

+0

Bueno, es incorrecto para mí porque necesito acceder a ese método para dividir los archivos cargados (grandes) para que no sobrecarga la memoria del servidor. Si no necesitas acceder a ese método, supongo que estás bien. – dudeNumber4

-1

yo también asegurarse de que los datos objeto de la devolución por el método .count no es una cadena. Un valor de cadena de '0' siempre es mayor que un valor int de 0; que siempre volvería verdadero en esa condición.

Yo trataría de encasillar el .count return como un int para asegurarme de que se comparan los tipos adecuados. Incluso una cadena '-1' tiene un valor de bit mayor que int cero.

sólo un pensamiento, aunque podría estar equivocado ....

+0

'count' nunca sería una cadena, ya que es de tipo' int'. Gracias, sin embargo. – kzh

7

Request.Files.Count siempre contiene el no. de <input type="file"> elementos en su forma, envueltos en una tienda Key:Value. Por lo tanto, si su formulario publicado no contiene <input type="file"> etiquetas, entonces Request.Files.Count devolverá 0.

Cada Key es el name de la <input type="file" name="OneOfTheKeys"> y el valor es de tipo HttpPostedFileWrapper.

Consulte here para obtener más información acerca de HttpPostedFileWrapper.