Configuring file system providers

Kentico allows you to modify the behavior of file system providers. You can use different providers to access different parts of the application’s file repository, and you can change the default locations of different types of files.

Use the Kentico CMS.IO API and the following general process:

  1. Open the Kentico web project in Visual Studio (using the WebSite.sln or WebApp.sln file).

  2. Create a custom module class. Add the class into a custom Class Library project within the Kentico solution.

    For basic execution of initialization code, you only need to register a “code-only” module through the API. You do NOT need to create a new module within the Modules application in the Kentico administration interface.

  3. Override the module’s OnInit method and perform the required StorageProvider modifications. See the following use cases:

  1. Save all changes and rebuild the solution.

Custom storage providers on MVC sites

When utilizing the MVC development model, you also need to consider whether to deploy the assembly with the custom storage provider code to the separate MVC application (in addition to the Kentico administration project). Many folders, such as media libraries, are used both in the MVC live site application and the Kentico administration application. In these cases, your custom file system provider needs to be present in both applications to work consistently.

For additional information, see Customizing MVC projects.

Changing content file paths to a shared storage

The system allows you to change default file paths to a shared storage directory on a specific server. This can be particularly useful when running multiple related application instances, i.e. when using the MVC development model or a web farm in general. For example, you can map media files to a folder shared between all web farm servers, and thus eliminate the need to synchronize these files among the servers.

  1. Edit the custom project holding your storage provider logic in Visual Studio (see the general instructions at the start of this page).
  2. Perform the following in your module’s OnInit method:
    • Create a new instance of the StorageProvider class (the parameter of the CreateFileSystemStorageProvider method must be true).
    • Specify the target directory via the CustomRootPath property of the provider. This sets the root of the target path – the provider creates the relative path of the mapped folders within the given root directory.
    • Map a directory from your site to the provider.



using CMS;
using CMS.Base;
using CMS.DataEngine;
using CMS.IO;

// Registers the custom module into the system
[assembly: RegisterModule(typeof(CustomInitializationModule))]

public class CustomInitializationModule : Module
{
    // Module class constructor, the system registers the module under the name "CustomInit"
    public CustomInitializationModule()
        : base("CustomInit")
    {
    }

    // Contains initialization code that is executed when the application starts
    protected override void OnInit()
    {
        base.OnInit();

        // Creates a new StorageProvider instance for the Windows file system
        var sharedMediaProvider = StorageProvider.CreateFileSystemStorageProvider(isSharedStorage : true);

        // Specifies the target root directory. The provider creates the relative path of the mapped folders within the given directory.
        sharedMediaProvider.CustomRootPath = @"\\Server\CustomMediaRoot";

        // Maps a directory from your website to the provider
        StorageHelper.MapStoragePath("~/MySite/Media/", sharedMediaProvider);
    }
}


To create a StorageProvider instance for the Windows file system, call the CreateFileSystemStorageProvider static method of the StorageProvider class.

The value of the method’s bool parameter specifies whether the storage is shared among web farm servers.

Now every time the application requests or creates a file in the ~/MySite/Media directory, the location specified in the CustomRootPath property is used instead. In this example, the target folder is \\Server\CustomMediaRoot\MySite\Media.

Web farm servers will not attempt to synchronize media files and will instead use the files in the shared storage.

Using different file system providers for specific parts of the application’s file repository

The CMS.IO API allows you to access different sections of the application’s file repository using different file system providers. For example, you can store media files in the Azure blob storage, while all other files stay in the default Windows file system.

  1. Edit the custom project holding your storage provider logic in Visual Studio (see the general instructions at the start of this page).

  2. Perform the following in your module’s OnInit method:

    • Create a new instance of the StorageProvider class.
    • Map a directory to the provider.



using CMS;
using CMS.Base;
using CMS.DataEngine;
using CMS.IO;

// Registers the custom module into the system
[assembly: RegisterModule(typeof(CustomInitializationModule))]

public class CustomInitializationModule : Module
{
    // Module class constructor, the system registers the module under the name "CustomInit"
    public CustomInitializationModule()
        : base("CustomInit")
    {
    }

    // Contains initialization code that is executed when the application starts
    protected override void OnInit()
    {
        base.OnInit();

        // Creates a new StorageProvider instance (Azure storage provider in this example)
        var mediaProvider = StorageProvider.CreateAzureStorageProvider();

        // Maps a directory to the provider
        StorageHelper.MapStoragePath("~/MySite/Media/", mediaProvider);
    }
}


To create StorageProvider instances for the default file storage providers, call the following static methods of the StorageProvider class:

  • CreateFileSystemStorageProvider – returns instance of the default provider for the Windows file system. Has an optional bool parameter that specifies whether the storage is shared.
  • CreateAzureStorageProvider – returns an instance of the default provider for the Microsoft Azure Blob storage.
  • CreateAmazonStorageProvider – returns an instance of the default provider for the Amazon S3 storage service.

The application now uses the given file system provider to access the specified project folder. In the case of the sample code above, the configured Azure storage provider is used to store and retrieve files from the ~/MySite/Media directory.

Changing content file paths to a different disk drive

The CMS.IO API allows you to change default file paths. For example, when using the Windows file system, you can store media files on a different disk drive.

  1. Edit the custom project holding your storage provider logic in Visual Studio (see the general instructions at the start of this page).

  2. Perform the following in your module’s OnInit method:

    • Create a new instance of the StorageProvider class.
    • Specify the target directory via the CustomRootPath property of the provider. This sets the root of the target path – the provider creates the relative path of the mapped folders within the given root directory.
    • Map a directory to the provider.



using CMS;
using CMS.Base;
using CMS.DataEngine;
using CMS.IO;

// Registers the custom module into the system
[assembly: RegisterModule(typeof(CustomInitializationModule))]

public class CustomInitializationModule : Module
{
    // Module class constructor, the system registers the module under the name "CustomInit"
    public CustomInitializationModule()
        : base("CustomInit")
    {
    }

    // Contains initialization code that is executed when the application starts
    protected override void OnInit()
    {
        base.OnInit();

        // Creates a new StorageProvider instance for the Windows file system
        var mediaProvider = StorageProvider.CreateFileSystemStorageProvider();

        // Specifies the target root directory. The provider creates the relative path of the mapped folders within the given directory.
        mediaProvider.CustomRootPath = @"D:\CustomMediaRoot";

        // Maps a directory to the provider
        StorageHelper.MapStoragePath("~/MySite/Media/", mediaProvider);
    }
}


To create a StorageProvider instance for the Windows file system, call the CreateFileSystemStorageProvider static method of the StorageProvider class.

This sample code ensures that every time the application requests or creates a file in the ~/MySite/Media directory, the location specified in the CustomRootPath property is used instead. In this example, the target folder is D:\CustomMediaRoot\MySite\Media