Ok, así que es una forma muy simple de css puro de crear su archivo de entrada personalizado.
Use etiquetas, pero como sabe por las respuestas anteriores, la etiqueta no invoca la función onclick en firefox, puede ser un error pero no importa con lo siguiente.
<label for="file" class="custom-file-input"><input type="file" name="file" class="custom-file-input"></input></label>
Lo que haces es diseñar la etiqueta para que se vea como quieres
.custom-file-input {
color: transparent;/* This is to take away the browser text for file uploading*/
/* Carry on with the style you want */
background: url(../img/doc-o.png);
background-size: 100%;
position: absolute;
width: 200px;
height: 200px;
cursor: pointer;
top: 10%;
right: 15%;
}
ahora simplemente oculta el botón de entrada real, pero no puedes configurarlo en visability: hidden
Así que hazlo invisible configurando opacity: 0;
input.custom-file-input {
opacity: 0;
position: absolute;/*set position to be exactly over your input*/
left: 0;
top: 0;
}
ahora, como habrán notado, tengo la misma clase en mi etiqueta que en mi campo de entrada, eso es porque quiero que ambos tengan el mismo estilo, por lo tanto, cada vez que hace clic en la etiqueta, en realidad está haciendo clic en lo invisible campo de entrada.