1. Используйте input[type=submit]/button[type=submit]
2. Подпишитесь на событие submit на форме
3. В обработчике события запускайте загрузку файла с помощью примерно такой функции
// https://stackoverflow.com/questions/3916191/download-data-url-file/45905238#45905238?newreg=ddb3c48865d04c319b39f772df762521
function download(dataurl, filename) {
var a = document.createElement("a");
a.href = dataurl;
a.setAttribute("download", filename);
a.click();
}
3. Что касается невозможности нажатия на кнопку сабмита, если хоть одно поле формы не валидно, то навешайте примерно такой стиль:
#someform:invalid [type=submit]{
pointer-events: none;
/* другие нужные стили, да хоть display: none; */
}
4. Если редирект хотите выполнять на бэке, тот здесь проблем нет - просто перенаправляйте в бэковом обработчике формы. Если будете редиректить клиентом, то в обработчике сабмита отмените дефолтовую реакцию на ивент, с формы соберите данные и пошлите AJAX-ом на бэк, и затем делейте редирект на сэнкью-пейдж, если данные отправились успешно.