My solution was FTP move them (crude but it worked). Not 100% sure why. At first I moved only the optimized images and it didn’t fix the problem, but when I moved all the images it resolved my issue.
Thanks for the more detail instruction on how to FTP into my two Discourses. The uploads
file was about 125 MB on the old Discourse, 60 MB on the new one. So I copied the old one to my laptop’s Desktop. Then I copied its contents, folder-by-folder, to the new Discourse, skipping any duplications.
And to my surprise, it appears to have solved the problem. All image uploads appear to be fixed, both in threads that pre-date my Discourse migration, and in threads that I created today in troubleshooting.
I might theorize that Discourse was re-using pre-existing pointers to content that somehow was lost in the move. So if I re-uploaded the exact same image file, it would re-use a broken pointer and repeatedly fail. But when I resaved it as a new file, it succeeded because it stored a new copy with a new pointer. Perhaps.
Thanks again very much.