Элемент ввода файла общеизвестно сложно стилизовать. Одна из проблем заключается в том, что это действительно один элемент, даже если он отображается как два элемента.
Один из подходов - скрыть весь элемент за кулисами и вместо этого предоставить пользователю пользовательские элементы. Вот статья об этом. По сути, элемент ввода файла скрыт, и некоторые пользовательские элементы, поддерживаемые некоторым JavaScript, обрабатывают пользовательский интерфейс и передают необходимую информацию в файл.