BLOB providers are a framework designed to store large amounts of binary data in an optimized and cost-effective solution, such as cloud storage instead of in a database.
## BLOB providers
The Optimizely platform supports BLOB storage of assets using a provider-based setup, and has a built-in file BLOB provider. You have the following options:
**Built-in BLOB provider** for media files such as images, videos, and documents, stored on local disc or a file share that is defined during installation.
**Customized BLOB provider** for your specific hosting environment, such as BLOB providers for Microsoft Azure and Amazon Web Services, which are available from the [Optimizely NuGet feed](🔗).
## BLOB architecture
A provider is responsible for storing a stream of data and associate it with a unique identifier. BLOBs are grouped into containers which is a logical name for a set of BLOBs, which you can delete with a single API call. The unique identifier is exposed as a URI in the format **epi.fx.blob://\[provider\]/\[container\]/\[blob\]** to store a reference to a BLOB in a database.
Most methods in the API return a reference even though the actual BLOB does not exist, because it would be too costly to access a cloud service every time; for example, a call to GetBlob is made, and it is assumed that the caller keeps track of BLOB identifiers.
The example below shows how to use a BLOB provider.
When you delete a container under the website root, if you use the `
FileBlob` provider, it leaves empty folders under the website root. If you use the Azure or the Amazon provider, it deletes the containers. For information about handling media in the assets pane, see [Working with media](🔗).
## Configuring a custom BLOB provider
Add a BLOB element to the episerver.framework section in _web.config_ to define a custom provider:
Another option is to add the BLOB provider programmatically during the configuration phase of the site initialization. This can be done by creating an initialization module that implements the `
IConfigurableModule` interface and handle the registration in the `
ConfigureContainer` method through one of the extension methods available on the `
context.Services` property or by configuring the `
BlobOptions` class directly.