viernes, 18 de noviembre de 2011

Un control para subir archivos (bastante) versátil.


Notas de actualización:
Si bien este artículo se vio ya superado por nuevas tecnologías, queda como una buena referencia de aprendizaje. Si estás buscando un control ya hecho, con buenas funcionalidades, recomiendo que busques las referencias al final del artículo.

La Web 2.0 permitió a los usuarios de internet interactuar bases de datos y archivos y procesos del servidor, lo que dió lugar a los sitios dinámicos que se alimentan con información de los usuarios.  Un control interesante en ASP:NET que permite esto es el control FileUpload para subir archivos desde la máquina del usuario al servidor sin necesidad de usar FTP. Con este tipo de controles, compartir fotos en la red y otro tipo de archivos se transformó en un juego de niños.

Sin embargo, el control que viene con Visual Studio permite subir un archivo por cada control que se incluya, lo que limita la cantidad de archivos a la cantidad de controles incluidos en la página. Una opción es preguntarle al usuario cuántos archivos quiere subir para que podamos crear dinámicamente la cantidad de controles que necesitemos, pero a veces este procedimiento es un tanto molesto.

Inspirándome en este artículo decidí construir este control web (Web User Control) que aquí publico, el que  permite agregar dinámicamente la cantidad de archivos a subir a medida que los vamos eligiendo. El secreto se basa en ir agregando los controles desde JavaScript, para evitar perder los archivos que se fueron cargados con algún eventual Postback producido por algún  otro evento de la página.

Este control dista bastante de esos como los que usa Google o Facebook, donde se pueden seleccionar todos archivos de un saque, pero es bastante simple y práctico. Aquí está disponible el código fuente, por lo que cada uno pude hacerle las mejoras que requiera para su proyecto. Por otro lado, tampoco es asincrónico. Para eso recomiendo hacer algo con el control Ajax AsyncFileUpload.

Volviendo a lo nuestro, así se ve el control en Internet Explorer 8 y Opera 11 , con la hoja de estilos CSS adjunta. Con Firefox se ve bastante parecido a esto también.

Chrome y Safari muestran el control FileUpload de otra forma, por lo que habrá que modificar los estilos correspondientes si se quiere cambiar el aspecto.


Este control tiene algunas propiedades que lo hacen relativamente versátil y facilitan su uso.


Propiedad

Descripción

Valor default

Titulo

Título a mostrar en el control. Para no mostrar nada, establecerlo en string.empty.

Si no se establece esta propiedad, se muestra "Archivos a subir".

Comment

Una nota depués del título.

string.empty

DestinationFolder

Carpeta donde se guardarán los archivos en el servidor. Si no existe, puede ser creada. Se establece el path relativo y no el físico. Para que la carpeta sea creada en el servidor, el usuario de internet debe tener premisos de escritura. Esta propiedad es obligatoria.

-

UploadButtonIsVisible

Muestra el botón de "Subir archivos" dentro del control. Sirve para subir los archivos de forma independiente al resto de las acciones de la página. Si se quiere realizar otras acciones antes de subir los archivos se puede dejar este botón no visible y llamar manualmente al evento UploadFiles(CreateDir).

false (no visible)

FileExtensionsEnabled

Limita los archivos a subir a las extensiones aquí definidas. Las extensiones se deben establecer separadas por "|" (pipe). Ej: ".txt|.jpg|.gif". Si no se establece esta propiedad, cualquier extensión es admitida.

null

HasFile

Solo lectura. Indica si el control tiene al menos el primer archivo seleccionado.

false

MaxFilesLimit

Cantidad máxima de archivos que el usuario puede agregar. Si se establece en cero, funciona igual que el control estándar FileUpload (solo deja subir un archivo). Si esta propiedad no se establece no limita la cantidad de archivos a agregar.

null

MaxUploadSize

Límite en bytes de la tranferencia de todos los archivos a subir. Ver debajo más detalles sobre limitaciones.

Hasta 4 MB

El control tiene solo un método:


Método

Descripción

UploadFiles(bool CreateDir)

Realiza la subida de los todos los archivos seleccionados en el control. Si el parámetro CreateDir se establece en true, indica que el directodio destino definido en
DestinationFolder debe crearse si no existe.

Limitaciones:

  • Por cuestiones de seguridad, de manera predeterminada con el control FileUpload se pueden subir de hasta 4 megabytes de una sola vez. Pasado ese límite se producirá un error "denial of service". Este control no captura ese error.
    Sin embargo, tal como se explica en la especificación de la clase FileUlpload, se puede aumentar ese límite modificando el web.config de la aplicación. Por ejemplo para establecer el límite en 100MB, que deben ser subidos en menos de 15 minutos, se debe agregar <httpRuntime  maxRequestLength="102400" executionTimeout="900"/> dentro de <system.web>  del archivo web.config de nuestra aplicación web.
  • El control está escrito en C#, por lo que los programadores de Visual Basic .Net deberán pasarlo. Se agradece el aporte de quien lo haga. Una página que puede ayudar a ésto es esta, que permite convertir C# en VBNet y viceversa. Funciona bastante bien.
  • Solo se puede utilizar un control por página. Para utilizar varios en una misma página es necesario realizar modificaciones al código.

Uso simple:
El siguiente video explica como implementar el control de manera  simple y rápida con Visual Studio 2010.



Download de archivos:
Desde aquí se puede bajar el código fuente del control con sus estilos para usarlo directamente.


Aquí hay un ejemplo de configuración y uso en un ejemplo para Visual Studio 2010.

  • MultiFileUpload_VS2010example.rar (actualizado nov.2012 con función para mostrar los archivos subidos. Hacer Archivo > Descargar para bajar el proyecto completo ).


Conclusión:
Más allá de la utilidad de este control, en el código fuente se puede ver cómo manejar propiedades dentro de un Web User Control utilizando el StateBag ViewState, registrar código JavaScript en una página o en su Masterpage con RegisterStartupScript y hasta cómo usar básicamente expresiones regulares.

Espero sea de utilidad.

Actualización:

Para soluciones más concretas quizás quieras ver este control, que está hecho pensando en las  posibilidades del javaScript sobre los navegadores más nuevos.

Actualización 2:
Con la evance y difusión de jQuery como standard, sin dudas el control que yo utilizaría es jQuery File Upload.


56 comentarios:

  1. Hola Marcelo, interesante el control. Tengo una duda, a ver si me la puedes aclarar. Yo necesito subir varios archivos, 4-5, cada uno de ellos, debe estar referenciado de una forma concreta, por ejemplo, un documento es un contrato, otro un certificado, otro un proyecto...siempre el mismo tipo de documentos. Me gustaría que cuando se suban, se marque sobre una base de datos el documento que se ha subido, vamos, el tipo de documento (contrato, certificado, etc.) ¿Eso es posible con este control?

    ResponderEliminar
  2. Hola José. Sobre el control lo que se puede hacer es restringir el tipo de archivo a subir (en base a su extensión) y en todo caso su
    tamaño.
    Para el problema que planteas, solo se me ocurren dos cosas: poner un control independiente para cada documento y dejar la responsabilidad al usuario para que determine cuál va a ir en cada uno e incluirlos correctamente, o procesar el archivo una vez subido para detectar el tipo de documento. Este sería como "abrir" y "leer" el documento automáticamente. Si son archivos de texto es fácil, se complica algo más para otros tipos de archivo. Si fueran de Word, por ejemplo, se podría usar Automation para eso.
    Luego de esta validación, hay que ponerle un mensaje al usuario y eliminar el documento incorrecto del servidor.

    El control es simplemente un transportador de archivos que permite transferirlos desde una máquina a otra vía HTTP, y no mucho más que eso.

    Saludos, y gracias por los comentarios!

    ResponderEliminar
  3. Gracias Marcelo,

    Seguramente la mejor opción es la primera que planteas, que se suban documentos de forma independiente con un control...Probaré a ver que saco.

    Gracias. Un saludo,

    José Manuel

    ResponderEliminar
  4. hola que tal una vez que ya tenga subido los archivos para poder mandarlos a traer por fecha o por nombre y tambien como eliminar los archivos una vez cargados

    ResponderEliminar
  5. Utiliza System.IO.

    // Elimina todos los archivos de la carpeta "Biblioteca"

    System.IO.DirectoryInfo _dirInfo = new System.IO.DirectoryInfo(HttpContext.Current.Server.MapPath("~/Biblioteca"));
    System.IO.FileInfo[] _filesInfo = _dirInfo.GetFiles();
    foreach (System.IO.FileInfo _f in _filesInfo)
    {
    if (_f.Exists) // Este if es demostrativo. Se supone que si está en la lista existe.
    _f.Delete();
    }

    // Este ejemplo abre el archivo "Nombres.txt" de la carpeta "App_Data" y lee su contenido.
    System.IO.StreamReader _st = System.IO.File.OpenText(HttpContext.Current.Server.MapPath("~/App_Data/Nombres.txt"));
    while (!_st.EndOfStream)
    {
    // lee cada línea del archivo de texto.
    string _tema = _st.ReadLine();
    // hacer algo
    }

    Espero te ayude.
    Saludos!

    ResponderEliminar
  6. Sera posible tener ese ejemplo en Visual Studio 2008?

    ResponderEliminar
  7. Lo que puedes hacer es crear un proyecto con Visual Studio 2008 y luego incluir los archivos del ejemplo manualmente. No lo probé, pero el código debería funcionar sin problemas.
    Saludos!

    ResponderEliminar
  8. Necesito realizar algo medio complejo, la idea es desde un sitio web, buscar archivos excel, y obtener la ruta del archivo para poder manipularlo como origen de datos (OLEDB), pero he intentado obtener la ruta fisica del archivo y creo que por seguridad no lo permite (en WEB), si pudiera ayudar seria de gran a yuda o una orientacion de como se puede realizar esto, me han dado ideas de poder utilizar en archivo en memoria (convertir un streamFile en xls y viceversa),
    atentoa sus comentaios
    DIEGO; CHILE

    ResponderEliminar
    Respuestas
    1. Hola Cristopher, aclarame esto: ¿los archivos excel a buscar están en el servidor verdad? deberían estar en un directorio del cual puedas obtener la ruta física mediante Server.MapPath, o bien teniendo la ruta física esa carpeta tendría que tener permisos de lectura al menos para el usuario del sistema configurado en el IIS. ¿qué error te está dando al intentar acceder a los archivos?
      Convertir el archivo en memoria sería algo un tanto pesado de procesar, ya que lo estarías haciendo por cada sesión o usuario conectado. Una vez obtenido el archivo yo lo copiaría a un directorio de trabajo temporal y luego ahí trabajas con el. Hay que ver cuales son tus necesidades funcionales...

      Eliminar
  9. Aqui codigos VB.Net 2010 --->http://ayudaveloz.blogspot.com/

    ResponderEliminar
  10. Hola Marcelo muy buen tuto para este control, queria ver si me puedes ayudar a implementar con este mismo control una barra de progreso, es decir que avise el progres de subida del archivo. Gracias!

    ResponderEliminar
    Respuestas
    1. Muchas gracias por los comentarios Nelson. La idea de la nota es sobre todo introductoria al tema. Pero más allá de eso, igualmente me encantaría poder ayudarte, aunque por el momento estoy con muy poco tiempo para los desarrollos. Te paso aquí unos links que tienen código de ejemplo para bajar. Quizás encuentres la solución a tu problema más concretamente:

      http://www.codeproject.com/Articles/106511/Multiple-file-uploads-with-progress-bar-using-clas

      http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html

      Por otro lado, no dejes de ver fineuploader, que es un control javascript que seguramente funcionará muy bien en los nuevos navegadores (yo no lo probé, así que no te puedo dar muchos detalles, pero un amigo me lo recomendó):
      http://fineuploader.com/

      Espero con esto darte al menos un indicio para que puedas lo que necesitas.

      Eliminar
  11. hola marcelo, me gusto la explicacion, pero tengo un problemita que detecte, al momento de subir 2 archivos con el mismo nombre, lo sobreescribe, incluso probe subiendo 2 archivos con el mismo nombre pero diferentes extensiones un jpg y un doc, pero igual lo sobreescribe, no se si me puedes ayudar a restringir esa parte muchas gracias, saludos

    ResponderEliminar
    Respuestas
    1. Paola, ¿estás segura que verdaderamente tiene distina extensión? Para comprobarlo, pod´s poner un breakpoint luego de la definición de la variable _f2Save (línea 144 del control ucMultiFileUpload.ascx). En esa variable vas a ver el path y nombre del archivo completo. De todos modos, si aún te interesa verificar que el archivo existe antes de guardarlo podría validarlo haciendo algo como

      if (!File.Exists(_f2save))

      justo antes de guardar el archivo, donde dice _postedF.SaveAs(_f2save);

      Espero que te sirva!
      Saludos

      Eliminar
  12. hola Marcelo ..para poder mostrar automaticamente las imagenes k acabas de subir es posible hacerlo.. disculpa pero no llevo mucho usando el Visual Studio . Gracias por el aporte ya con eso es bueno para sakar mi proyecto

    ResponderEliminar
    Respuestas
    1. Te doy un ejemplo básico:
      agrega un panel en la página, (asp:Panel runat="server" ID="pnlImagenes")

      Después, en el codebehind de la página recorres el directorio donde se subieron los archivos (la propiedad “DestinationFolder” del control) y se la asignas a un nuevo control Image. Luego agregas este control a la colección de controles del Panel “pnlImagenes”.

      Actualicé el archivo con el proyecto de ejemplo con el código para mostrar las imágenes. Bajalo para ver cómo funciona. Para más información lee mi respuesta al mensaje de zirba del 29 de mayo 2012.

      Eliminar
  13. hola lo tienes para vb.net gracias

    ResponderEliminar
    Respuestas
    1. No, pero fijate en el texto de la nota que hay un link a un conversor de código C#/VB.Net. Con un poco de trabajo lo podrás convertir.
      Saludos.

      Eliminar
  14. hola marcelo como se confgura el web.config
    cuando a tu maquina la haces servidor.. ya logre hacer la maquina en servidor.. pero al momento de logearme no me acccede es error de base de datos no la jala.. estuve investigando y es el web.conf creo ay codigo que tiene que implementarse pero me perdi. gracias

    ResponderEliminar
    Respuestas
    1. Hola Lino, disculpame pero no entiendo muy bien tu pregunta ¿cuál es el error que te aparece, o qué es lo que estás intentando hacer? Este control no tiene nada que ver con la base de datos. Si es en el proyecto del ejemplo, el mismo está creado como aplicación desde Visual Studio, con lo cual incorpora mecanismos de login, pero en este caso no se utilizan.
      Saludos.

      Eliminar
  15. hise esto http://oferycompra.no-ip.org/
    el servidor es mi lap.. pero el login no me deja accceder sabe como solucionar eso??
    no puedo acceder el formulario no sirve
    estuve investigando y se le modifica el web.conf que se crea una vez k hisistes el servidor pero ay me perdi..

    ResponderEliminar
  16. El login funciona con una base de datos. En el web.config hay que configurar el string de conección en la sección "connectionStrings"(generalmente el string de conexión predeterminado es el "DefaultConnection").
    Más información no puedo darte por aquí, ya que esta nota habla de un control para subir archivos, y tu consulta escapa al tema. Te sugiero que busques por temas con referencia a SQL Memebership Provider y creación de cadenas de conexión.
    Saludos.

    ResponderEliminar
  17. oie disculpa marcelo no tienes unos links para mi ayuda lo que pasa es que yo quiero subir los harchivos poder eliminarlos y visualizalors ala ves que cuando lo seleecione pueda ver el harchivo o acceder a el lo cual igual quiero consultar los harchivos y poder buscarlo por su nombre por q si tengo muchos harchivos seria dificil buscarlos..

    ResponderEliminar
    Respuestas
    1. Steephen, en ese caso te sugiero que utilices una base de datos donde guardes el nombre del archivo. A partir de eso se puede crear una página de búsqueda y eliminación (y otras cosas que quieras, como por ejemplo añadir comentarios). Así, cuando el usuario elimina el nombre del archivo de la base de datos, eliminas también el archivo físico en el mismo proceso.
      Saludos!

      Eliminar
  18. Buenas tardes,

    Habría forma de cear x número de fileupload en el load de la página que contiene el control?, es decir no crear los controles al presionar el botón agregar. Gracias.

    ResponderEliminar
    Respuestas
    1. Si, básicamente de dos formas: una es modificando el código JavaScript que se crea dinámicamente con el control. En en el code behind del control (ucMultiFileUpload) se encuentra el elemento StringBuilder _js, que contiene el código JavaScript que crea el control cada vez que el usuario presiona el botón de agregar. Elimina ese botón y modifica el JavaScript para crear varios controles juntos. La otra opción es modificar el control para que sus propiedades se manejen a través del ViewState de la página, en base a un ID único de elemento HTML que se genere dinámicamente (por ejemplo un GUID). De esa manera se pueden usar varios controles independientes en la misma página, pero como dice la nota, en este ejemplo eso no está contemplado y en cualquier caso tendrás que modificar el código.
      Saludos!

      Eliminar
    2. Buenas tardes,

      Modifique el código de java script como recomendó, y lo que hice fue adicionarle un textbox al control en el cual ingreso el número de controles FileUpload que quiero crear y al dar clic en el botón Agregar se cran, pero cuando intento cargar los archivo que he seleccionado estos no me suben, la única forma de que me suban es dejando siempre el primer FileUpload que no es creado por javascript. Alguna idea de porque pueda suceder esto. Gracias.

      Eliminar
    3. ¿Podrías pegar aquí el código modificado? Así vemos si podemos encontramos el problema.
      Saludos!

      Eliminar
    4. El cambio no fue muy grande, básicamente pasé el javascript al ucMultiFielUpload.ascx y quité el método "protected override void OnPreRender" y quedó así:

      <_script type="text/javascript">

      function addFileUploadCtrl() {

      var a = document.getElementById('MainContent_ucMultiFileUpload1_txtNumDocs');
      for (i = 1; i <= a.value; i++) {
      if (!document.getElementById || !document.createElement)
      return false;

      var uploadArea = document.getElementById("MainContent_ucMultiFileUpload1_pnlUpload");
      if (!uploadArea) return;

      var _uploadControl = document.createElement("input");

      if (!addFileUploadCtrl.newID)
      addFileUploadCtrl.newID = 1;

      _uploadControl.type = "file";
      _uploadControl.setAttribute("id", "upldFile_" + addFileUploadCtrl.newID);
      _uploadControl.setAttribute("name", "upldFile_" + addFileUploadCtrl.newID);
      _uploadControl.setAttribute("class", "fileInput");
      uploadArea.appendChild(_uploadControl);
      addFileUploadCtrl.newID++;



      document.getElementById("MainContent_ucMultiFileUpload1_lblInfo").style.display = 'none';
      }
      }



      Modifique la etiqueta para que me aceptara publicar.

      Adicioné un textbox (txtNumDocs) que es donde ingreso el número de controles a crear y al pulsar el agregar (el mismo) me crea los controles.

      El problema está en la Línea HttpFileCollection _fcol = Request.Files; ya que en _fcol no me trae ninguna colección de controles.

      Espero esto te sirva para ver si encuentras ves donde puedo estar cometiendo algún error.

      Quedo atento a su respuesta. Gracias por la ayuda.

      Eliminar
    5. La verdad que no pude encontrar el error porque tu código funciona. Lo copié tal cual y modifiqué el resto tal como lo indicas. Los archivos subieron perfectamente. Fijate si no hay algún otro tipo de problema. Yo lo probé con Chrome. En todo caso mira el código de la página inspeccionando con el navegador (presionando F12, que es lo mismo para Explorer y otros). Lo único que estaba mal al copiar fue que la primer línea dice "_script type..." (hay un guion bajo antes de script) y hay agregar el cierre del bloque de javascript. Todo lo demás está bien.

      Saludos

      Eliminar
    6. Muchas gracias por tomarse el tiempo de revisar el código, el guión bajo enla etiqueta lo coloque para que esta página me dejara publicar dentro del comentario el código, ya que no recibia la etiqueta. Voy a revisar lo que me comenta y si encuentro algo lo estaré comentando. Muchas gracias de nuevo.

      Eliminar
  19. buenas tardes

    tengo una pregunta

    ¿Que código utilizo para descargar un archivo que se subió por medio del control fileupload?

    muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola,
      Para descargar el archivo solo hay que poner un link que apunte a la url del mismo dentro de tu sitio. Fijate además que una de las respuestas de los comentarios está el código para eliminar los archivos.
      Saludos

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Buenas tardes marcelo

      he investigado acerca de las descargas de archivos y las funciones que tiene cada método y propiedad de este, generé el siguiente código en el evento linkbutton sin ningún error:

      protected void LinkButton1_Click(object sender, EventArgs e)
      {
      string filename = Request.QueryString.Get("FileName");

      if (String.IsNullOrEmpty(filename))
      {
      String dlDir = "~/uploads/";
      String archivo = Server.MapPath(dlDir + filename);

      System.IO.FileInfo toDownload = new System.IO.FileInfo(archivo);

      if (!toDownload.Exists)
      {
      Response.Clear();
      Response.AddHeader("Content-Disposition", "attachment; nombre de archivo= 84960212.jpg"+archivo);
      Response.AddHeader("Content-Length", toDownload.Length.ToString());
      Response.ContentType = "application / octet-stream";
      Response.TransmitFile(Server.MapPath("~/uploads/84960212.jpg"));
      Response.WriteFile("~/uploads/84960212.jpg");
      Response.End();
      }
      }
      }

      Al ejecutar me descarga el mismo formulario en vez del archivo que estoy pidiendo.

      PD:

      Tengo entendido que la linea de código Response.ContentType = "application / octet-stream";

      esto debería abrír la ventana auxiliar "guardar como..."

      Muchas Gracias.

      Eliminar
    4. Hola Maico, me parece que te estás enredando más de la cuenta. Lo único que tienes que hacer es crear un link (con el tag HTML "a") a tu archivo. En tu caso, algo así como [a href='uploads/84960212.jpg'>84960212.jpg[/a] (cambia los corchetes por los correspondientes signos mayor y menor).
      En el caso de las imágenes, el navegador va a abrirlas (el usuario debería saber cómo descargar una imagen al disco). Archivos con otras extensiones, el navegador va a intentar la descarga automáticamente. Mira en el código del ejemplo de la nota (descarga la última versión actualizada, por las dudas), y ve cómo se generan las imágenes dinámicamente para darte una idea.

      Eliminar
    5. Muchas Gracias por la aclaración marcelo, no me habia fijado que eso también se podía realizar por etiquetas, pero en el proyecto que estoy realizando el profesor me exijio con código. De todas Formas ya me descarga el archivo por código.
      Muchas Gracias.

      Eliminar
  20. Hola marcelo, Buen tutorial!, Mi pregunta es cuales permisos hay que modificar para poder visualizar los archivos subidos en la solucion de visual studio

    ResponderEliminar
    Respuestas
    1. Si pudiste subirlos es porque la carpeta del sitio donde se guardan los archivos tiene ya permisos de escritura. El mismo usuario de internet (configurado en IIS) seguramente entonces que ya tenga también configurados permisos de lectura sobre esa carpeta, para que los archivos puedan descargarse.
      Saludos!

      Eliminar
  21. en serio funciona el codigo? tengo un proyecto en asp.net y agrego los archivos .ascx y .ascx.cs al proyecto, pero no se como registrarlos al proyecto, porque la linea

    Protected WithEvents ucMultiFileUpload1 As Global.MultiFileUpload

    marca error porque no esta definido, como agrego la referencia?

    ResponderEliminar
  22. ah ya lei que se necesita transcribirse para usar en vb. gracias.

    ResponderEliminar
  23. Saludos,,
    Antes que todo le quiero agradecer por este aporte, me es de mucha ayuda.
    Como puedo cambiarles los nombres a los archivos el momento que subo??

    ResponderEliminar
    Respuestas
    1. Oscar, al momento de guardar (fijate en la #region Guardar Archivo) le cambias el nombre al hacer _postedF.SaveAs(_f2save), donde _f2save es la ruta y nombre de tu archivo.

      Saludos!

      Eliminar
    2. Gracias Marcelo, voy a intentarlo.

      Eliminar
  24. Funcionó a la perfección. Gracias Marcelo. (Existe un error en Internet Explorer al momento de agregar otro campo de "file", la etiqueta "Agregar" se cambia de posición) pero nada complejo.

    ResponderEliminar
  25. estimado, soy nueva en esto del Java Script y no sé por que hago todos los pasos del tutorial para agregar el control a mi proyecto y no me reconoce los labels el control nada... no se que estoy haciendo mal

    ResponderEliminar
    Respuestas
    1. Hola Natalia,
      Tendría que ver tu código para ver qué te está pasando. Pero antes ¿bajaste los archivos de ejemplo, que si funcionan? En todo caso te sugiero que compares los que estás haciendo con los archivos del proyecto de ejemplo.

      Saludos!

      Eliminar
  26. El segundo link esta caido, lo podrias resubir por favor.

    ResponderEliminar
    Respuestas
    1. Gracias por el aviso Joel. Ya está reparado el link.
      Saludos!

      Eliminar
  27. Hola Marcelo, me encanta el control, es un excelente aporte.Ahora, tengo que resolver algo, ¿Qué debo cambiar en el código para que me valide la extensión del archivo, al presionar el botón "Agregar"?. Actualmente lo hace, pero al final cuando le das al botón "Subir Archivos" y te borra todo lo que ingresaste en los distintos FileUpload.

    ResponderEliminar
    Respuestas
    1. Hola, muchas gracias por tus comentarios.
      Fijate que hay una función ValidarExtensiones(HttpFileCollection p_Fcol) a la que se le pasan los archivos a subir. Una expresión regular valida que la extensión exista, y sino elimina los archivos del upload.

      Las extensiones se especifican en la propiedad del control FileExtensionsEnabled. Fijate que en este mismo texto está la definición, y cómo se utiliza.

      Saludos!

      Eliminar
  28. Hola Antes que todo le quiero agradecer por este aporte, me es de mucha ayuda, ya tenga subido los archivos. Todo es en visual studio espero tu ayuda por favor:
    Es la pregunta
    En la elección universitaria hubo problemas por algunos alumnos de las sub-sedes.
    Permita subir los resultados obtenidos por cada lista en la sede central y en cada sub-sede. Después de cargar los archivos debe procesarlos y dar los resultados finales con la lista ganadora, y si ninguno de ellos supera el 50%+1, entonces mostrar el mensaje que habrá “segunda vuelta” en caso que haya dos o más listas. Si hay solo una lista, entonces, se declara las elecciones como “Anulado”.
    1) mostrar el contenido de archivo 1,2,3 en un listbox.
    2) Procesar los archivos con los resultados de los votantes.
    3) Mostrar los resultados del ganador de las elecciones o si hay segunda vuelta
    4) El número de archivos muy variable
    5) Verificar duplicidad de archivos cargados

    ResponderEliminar
  29. Link caido pueden volver a subirlo porfavor

    ResponderEliminar