It is based on your requirement.
Send all data to the server when user has completed all steps.
If all the information(basic info, addresses, upload image) of the user are needed according to your requirement, then this is the best option.
Just think for yourself, You are going to send a three set of data to your server. Then which of the following is optimal ?
a) send the first set , send the second set , send the third set (totally three server calls)
b) store all the data temporarily till the end of the wizard and send all the three sets of data to the server (one server call)
Obviously option (b) will be the best one to choose.
Even if some accidents (unexpected error) happens in the middle, it wouldn't make sense if you just store incomplete or half data in your db (because you need all the info). It is better to let the user continue entering them just by retaining the info on the fields(maintain viewstate) and then save the info in the end of the wizard by sending them to the server.
Save data to the server each time user has completed a single step.
If all of the information are not mandatory and a specific set of data (any of the data sets) then you can send them to the server at the end of each step.
If some accidents happens in the middle, then you will probably have an one or two sets of data stored in your database, So depending on that you give the options to the user when he attempts to do the process again. I know it is tedious but definitely better than asking him all the info all over again. This is actually not a good practice, since the performance could be affected drastically with so much server calls which can easily optimized with your first approach.
Conclusion: As i mentioned earlier, the answer is based on your requirement. So if you just take care of the viewstate (maintaining the user inputs on all fields) it would be perfectly fine". Based on performance i would recommend the first choice "Sending all data to the server when user has completed all steps.