Maquillar un Input file upload

Vamos a ver de que forma podemos maquillar los feos controles de upload de los formularios sin utilizar javascript y validando xhtml.

Lo que vamos a hacer es colocar un div en lugar del input_file, y este dentro del div de la siguiente manera

1
<div class="upload"> <input type="file" name="upload" /> </div>

Aplicamos ahora una capa de maquillaje que lo deje irreconocible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
div.upload {
position: relative;
width: 80px;
height: 24px;
overflow:hidden;
background:url(btn_upload.png) left top no-repeat;
clip:rect(0px, 80px, 24px, 0px );
}

div.upload input {
position: absolute;
left: auto;
right: 0px;
top: 0px;
margin:0;
padding:0;
filter: Alpha(Opacity=0);
-moz-opacity: 0;
opacity: 0;
}

Qué es lo que hemos hecho ? Simplemente hacer transparente el input_file, y mediante la propiedad css «clip» evitamos que el control se salga de los límites del div.

Y para que su aspecto sea más profesional todavía, le añadimos al div una imagen como esta

Botón upload

[ demo ] [ descargar ]

22 comentarios.


  • 17 de julio de 2009 a las 23:41
    Mauricio Moreno dice...
    Amigo muchas gracias.

    Facil, sencillo y funcional.

  • 18 de julio de 2009 a las 0:17
    cmacias dice...
    Un verdadero placer ;)

  • 26 de agosto de 2009 a las 2:40
    ale Photoshop dice...
    Buenas muchachos,
    Les escribo acá en el primer post que me crucé de esta pagina que me gusta mucho, porque se que aquí hay muchos ex forum.macromedia.com... y estoy necesitando a alguna amita caritativa que me de una ayudita simple con un script para hacer un RANDOM en AS2... ¿se están juntando en algun foro en particular? bueno... espero no molestarlos y si me tiran alguna dirección con algun foro con un flujo frecuente de feedback se los voy a agradecer, y sino, alquien que me quiera dar una mano directamente, no hay drama... gracias...! y saludos Macias!

  • 26 de agosto de 2009 a las 10:27
    cmacias dice...
    Buenas, "Ale". Yo más que acceder a foros o listas concretas, suelo acceder a los Feed de Adobe [ http://feeds.adobe.com/ ]. Siempre se encuentran cosas muy interesantes.

    Un saludo !

  • 26 de abril de 2010 a las 17:22
    mouta dice...
    exelente. muchs gracias

  • 7 de mayo de 2010 a las 18:41
    Alex sanyago dice...
    Esta muy bien y si funciona y ya me salio pero para los que no saben y el codigo para c# de donde lo pueden sacar...!!

    yo ya lo saque asi que aqui lo pongo para aquellos que no sepan como yo...


    string fn = System.IO.Path.GetFileName(flimage.PostedFile.FileName);
    string SaveLocation = "e:" + "\" + "Imagenes_SIPCE" + "\" + fn;
    try
    {
    flimage.PostedFile.SaveAs(SaveLocation);
    //this.lblmessage.Text = "El archivo se ha cargado.";
    }
    catch (Exception ex)
    {
    Response.Write(ex.Message);

    }

  • 7 de mayo de 2010 a las 18:42
    Alex sanyago dice...
    solo para aclarar las dudas ese codigo anterior es un complemento para el codigo que ustedes ponen saludos espero les sirva.

  • 19 de mayo de 2010 a las 17:32
    ALEX SANYAGO dice...
    como leer un archivo de excel desde c# solo cambien la direccion de mi archivo y el nombre adaptandolo al suyo.


    Cambien el nombre donde dice datagrid4 por el nombre de su datagrid para que funcione




    String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + "E:\" + "Imagenes_SIPCE" + "\" + "ExcelData.xls" + ";" + "Extended Properties=Excel 8.0;";

    OleDbConnection objConn = new OleDbConnection(sConnectionString);

    objConn.Open();

    OleDbCommand objCmdSelect = new OleDbCommand(@"SELECT * FROM [Materiales$]", objConn);


    OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();

    objAdapter1.SelectCommand = objCmdSelect;

    DataSet objDataset1 = new DataSet();

    objAdapter1.Fill(objDataset1, "XLData");

    DataGrid4.DataSource = objDataset1.Tables[0].DefaultView;

    DataGrid4.DataBind();

    objConn.Close();



    peguen el codigo en el pageload o donde quieranq ue cargue su archivo.

  • 13 de septiembre de 2010 a las 23:43
    Elisa dice...
    Hola gracias por el ejemplo esta muy claro y me funciono a la primera solo cambie las direcciones que alex sanyago publica por las mias, una duda nadamas ya fuera de tema alex sanyago es famoso, si es el chico que sale en todas las redes o este alex sanyago es otro distinto a el.

  • 13 de septiembre de 2010 a las 23:44
    Luis dice...
    Gracias alex sanyago el ejemplo esta muy claro y con la adaptacion que publicas corre perfectamente en mi programa.

  • 25 de octubre de 2010 a las 18:24
    Rocio dice...
    No entendi bien ninguno de los codigos me los pueden explicar con un poco mas de detalle si no es mucha molestia

  • 27 de enero de 2011 a las 20:07
    lipedead dice...
    hey muy bueno :D
    gracias

  • 27 de enero de 2011 a las 20:32
    cmacias dice...
    Gracias ;)

    Un saludo

  • 29 de septiembre de 2011 a las 20:49
    Jorge dice...
    Muy buenos los ejemplos me funcionaron muy bien gracias sigan publicando mas informacion que sirva como esta.

  • 29 de septiembre de 2011 a las 21:19
    cmacias dice...
    Hola Jorge, este es quizá más completo ;)
    https://www.cmacias.com/maquillar-un-file-upload-2/

  • 15 de julio de 2012 a las 17:04
    Ramon Fernández dice...
    Sencillamente magistral

  • 7 de noviembre de 2012 a las 23:06
    Edgar dice...
    Excelente tip... Gracias por compartirlo.

  • 7 de noviembre de 2012 a las 23:16
    Carlos dice...
    Un placer :)

  • 16 de noviembre de 2012 a las 0:28
    Jose Lizana dice...
    Puede agregar el sgte. código (jQuery) para presentar el nombre del archivo una vez que lo selecciones:

    $(function(){
    $(".custom-input-file input:file").change(function(){
    $("#campTexto").val($(this).val());
    });
    });

  • 16 de noviembre de 2012 a las 0:45
    Carlos dice...
    Esa es una buena solución si centralizamos todos los scripts en un único documento. De hecho tengo un js preparado que genera no solo la estructura del input, sino el evento onchange.

    De todas formas, es algo similar (solo que inline) a lo que hago aquí : https://www.cmacias.com/maquillar-un-file-upload-2/

  • 11 de diciembre de 2012 a las 16:05
    Fedejimcle dice...
    Hola, ya hace tiempo de este post, y no sé si quizás queda un poco fuera de contexto, pero creo que el ejemplo queda mejor si al css de 'div.upload input' se le añade un "cursor: pointer" al elemento, así, cuando hay imágenes de background se ve más clara la imagen al modificar el puntero de ratón por la mano, :D.

    Un saludo, y muy buen ejemplo de código.

  • 11 de diciembre de 2012 a las 16:27
    Carlos dice...
    Hola Fede,

    No te falta razón. Totalmente de acuerdo.
    Efectivamente, de esa manera avisamos al usuario de que puede interactuar mediante un click con el "nuevo" elemento upload.
Deja tu comentario