Eu estava passando um bom tempo tentando fazer isso. Eu não queria usar uma solução Flash, e nenhuma das bibliotecas jQuery que eu olhei era confiável em todos os navegadores.
Eu vim com minha própria solução, que é implementada completamente em CSS (exceto a alteração no estilo onclick para fazer o botão aparecer 'clicado').
Você pode tentar um exemplo de trabalho aqui: http://jsfiddle.net/VQJ9V/307/ (Testado no FF 7, IE 9, Safari 5, Opera 11 e Chrome 14)
Ele funciona criando uma entrada de arquivo grande (com tamanho da fonte: 50px) e, em seguida, agrupando-a em uma div que possui um tamanho fixo e o estouro: oculto. A entrada é visível apenas através desta div "janela". A div pode receber uma imagem ou cor de fundo, o texto pode ser adicionado e a entrada pode ser transparente para revelar o fundo da 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)
}
Avise-me se houver algum problema e tentarei corrigi-los.