Probably not a suitable solution for most people, but switching the server to Jetty fixed the problem.
Inspired by the discussion on this question also having problems with Tomcat and HTTP/2, I tried using Jetty instead. I used a default configuration, enabled HTTP/2 and tested it with Safari and Chrome and the uploads from both were all as expected.