I'm in love with Cloudinary. Doesn't matter what my user uploads - File gets stored at Cloudinary / S3 and when I present the image back to the user, I choose how to manipulate it - be it gravity on a face for a avatar or specifying max width or max height for a banner image or etc... As the user can't be trusted to upload a reasonably sized photo (dimensions or file size) being able to control it on the front / backend is a win / win.