Eu sei que isso é antigo, e todas essas soluções são hacks em torno das precauções de segurança do navegador com valor real.
Dito isto, a partir de hoje, fileInput.click () funciona no Chrome atual (36.0.1985.125 m) e no Firefox ESR atual (24.7.0), mas não no IE atual (11.0.9600.17207). A sobreposição de um campo de arquivo com opacidade 0 em cima de um botão funciona, mas eu queria um elemento de link como acionador visível, e o sublinhado ao passar o mouse não funciona muito bem em nenhum navegador. Ele pisca e desaparece, provavelmente o navegador pensando se o estilo de foco flutuante realmente se aplica ou não.
Mas eu encontrei uma solução que funciona em todos esses navegadores. Não afirmo ter testado todas as versões de todos os navegadores, ou sei que continuará funcionando para sempre, mas parece atender às minhas necessidades agora.
É simples: posicione o campo de entrada do arquivo fora da tela (position: absolute; top: -5000px), coloque um elemento de rótulo em torno dele e acione o clique no rótulo, em vez do próprio campo do arquivo.
Observe que o link precisa ser script para chamar o método click do rótulo; ele não faz isso automaticamente, como quando você clica no texto dentro de um elemento do rótulo. Aparentemente, o elemento do link captura o clique e não chega ao rótulo.
Observe também que isso não fornece uma maneira de mostrar o arquivo selecionado no momento, pois o campo está fora da tela. Eu queria enviar imediatamente quando um arquivo foi selecionado, então isso não é um problema para mim, mas você precisará de uma abordagem um pouco diferente se sua situação for diferente.