I've had this problem and I recommend to store at least one original and resize either way in (uploading) or out (downloading) and I switching from doing the resize on uploads to doing the resize on downloads and the latter is preferable (to just save one which also is the original) which can depend on your implementation details. I first enabled limited number of simultaneous uploads and resized using my own code. It worked but was as low level as need to know os-dependant variables like directory paths and storing several copies of same image which is somewhat redundant.
Now I use google app engine and with python and can just save originals and send the image size as a parameter to a generated url for convenient resize to a size I always can change later.
100 pixels and original is
I find google app engine's solution very good since it saves storage and abstracts away details like mime type and filename (gae will do that for you). All I need to enable unlimited uploads and getting also the mime type and filename by leveraging the app engine api is a simple loop:
for upload in self.get_uploads():
img = Image(reference=user) #create reference to user
img.primary_image = upload.key() #create reference to blob
img.put() # save
And not only is this solution high-level since I'm not forced to define mime types or other low-level variables that may change, what's also preferable with saving just one (the original) is that it saves storage compared to saving copoies in different formats. So I recommend leveraging your service provider as much as you can since I'm glad with my experience in upgrading.
Another one of my apps requires 3 random images to have same size and that problem I'm going to solve by dynamically by request resizing 3 images to the same size of the smallest so that quality still is good from not scaling up.