FTP is not reliable. It has survived (though it's nearly dead) only due to entrenchment.
I didn’t have the time/resources for a deep dive to determine the root cause of the problem so my work-around at the time was to use `stat` to compare file sizes of the local and uploaded file. If they didn’t match, the file was simply re-transmitted – and it always worked the second time. ¯\_(ツ)_/¯
There's still millions of ftp servers running the wild: https://www.shodan.io/search?query=ftp