The advantages of cloud storages are nearly infinite storage capacity (use as much as you need, not as you have), the distance between the storage and your location (the data won't be lost in an accident or fire, and access of third parties to your data is severely limited), lowered cost of data management.
At the same time cloud storages work in the way that doesn't match regular approaches to storage access, such as hierarchical file systems and relational databases. Internally designed as huge tables with an index and BLOB field for data, they don't give enough flexibility that file systems or database management systems can offer to the developer and user. The developer needs to perform translation between the data he has in the application and the back-end cloud storage.
One more significant disadvantage is a difference between APIs, offered by different services. While most of services offer so-called REST API, this API is in fact a format for requests and responses sent over HTTP. Request commands, parameters and functions offered by services, differ significantly. Due to this switching between cloud services requires writing of separate code for each API.
Finally, the main factor of (in)acceptance of cloud storage-based solutions is a question of guaranteeing data safety. Though service providers tell us about encryption used on their side, such encryption is performed on their systems and there's no guarantee that it's really reliable and if it is even performed. So safety of the data is a real problem and not a fantasy of cloud storage opponents.
Luckily, there exists a possibility to address all of the above problems in a simple and very cost-effective way.