Me estaba divirtiendo muchísimo tratando de lograr esto. No quería usar una solución Flash, y ninguna de las bibliotecas jQuery que miré era confiable en todos los navegadores.
Se me ocurrió mi propia solución, que se implementa completamente en CSS (excepto por el cambio de estilo al hacer clic para hacer que el botón parezca "presionado").
Puede probar un ejemplo de trabajo aquí: http://jsfiddle.net/VQJ9V/307/ (Probado en FF 7, IE 9, Safari 5, Opera 11 y Chrome 14)
Funciona creando una entrada de archivo grande (con tamaño de fuente: 50 px), luego envolviéndola en un div que tiene un tamaño fijo y un desbordamiento: oculto. La entrada solo es visible a través de esta "ventana" div. Al div se le puede dar una imagen o color de fondo, se puede agregar texto y la entrada se puede hacer transparente para revelar el fondo div:
HTML:
<div class="inputWrapper">
<input class="fileInput" type="file" name="file1"/>
</div>
CSS:
.inputWrapper {
height: 32px;
width: 64px;
overflow: hidden;
position: relative;
cursor: pointer;
/*Using a background color, but you can use a background image to represent a button*/
background-color: #DDF;
}
.fileInput {
cursor: pointer;
height: 100%;
position:absolute;
top: 0;
right: 0;
z-index: 99;
/*This makes the button huge. If you want a bigger button, increase the font size*/
font-size:50px;
/*Opacity settings for all browsers*/
opacity: 0;
-moz-opacity: 0;
filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0)
}
Avíseme si hay algún problema e intentaré solucionarlo.