HTTP PUT is a reasonable way to do it, but browsers don't support it well. Meanwhile, HTTP POST multipart/form-data with CGI is least worst.
I don't like PHP, it is fully insane and has a long history of poor security. HTTP PUT with ranges would be useful, could mount filesystems over HTTP. Sam