Loading...
Area: Optimizely CMS
ARCHIVED This content is retired and no longer maintained. See the latest version here.

Recommended reading 

Media (such as an image, a PDF or Word document, a video, or mp3 file) are treated like any other content type but have an associated binary data that is stored using BLOB providers, which are optimized for storing streams of data.

The following example defines a simple content type that is used in the following examples:

C#
[ContentType]
public class GenericFile : MediaData
{
    public string Description { get; set; }
}

The following example creates a new file and defines a simple text file with the message Hello world:

C#
public void Uploading_a_file()
{
    var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
    var blobFactory = ServiceLocator.Current.GetInstance<BlobFactory>();

    //Get a new empty file data
    var file1 = contentRepository.GetDefault<GenericFile>(SiteDefinition.Current.GlobalAssetsRoot);
    file1.Name = "Readme.txt";

    //Create a blob in the binary container
    var blob = blobFactory.CreateBlob(file1.BinaryDataContainer, ".txt");
    using (var s = blob.OpenWrite())
    {
        StreamWriter w = new StreamWriter(s);
        w.WriteLine("Hello world");
        w.Flush();
    }

    //Assign to file and publish changes
    file1.BinaryData = blob;
    var file1ID = contentRepository.Save(file1, SaveAction.Publish);
}

The following example creates a location where the actual file type is resolved during runtime from extension:

C#
public void Uploading_a_media_from_extension()
{
    var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
    var contentTypeRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
    var mediaDataResolver = ServiceLocator.Current.GetInstance<ContentMediaResolver>();
    var blobFactory = ServiceLocator.Current.GetInstance<BlobFactory>();

    //Get a suitable MediaData type from extension
    var mediaType = mediaDataResolver.GetFirstMatching(".txt");
    var contentType = contentTypeRepository.Load(mediaType);

    //Get a new empty file data
    var media = contentRepository.GetDefault<MediaData>(SiteDefinition.Current.GlobalAssetsRoot, contentType.ID);
    media.Name = "Readme.txt";

    //Create a blob in the binary container
    var blob = blobFactory.CreateBlob(media.BinaryDataContainer, ".txt");
    using (var s = blob.OpenWrite())
    {
        StreamWriter w = new StreamWriter(s);
        w.WriteLine("Hello world");
        w.Flush();
    }

    //Assign to file and publish changes
    media.BinaryData = blob;
    var file1ID = contentRepository.Save(media, SaveAction.Publish);
}

The following example updates an existing file with new metadata:

C#
public void UpdatingMetaData_of_a_file()
{
    var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
    var blobFactory = ServiceLocator.Current.GetInstance<BlobFactory>();

    //the file to update, not hardcoded of course
    var fileID = new ContentReference(444);

    //Get the file
    var file1 = contentRepository.Get<GenericFile>(fileID).CreateWritableClone() as GenericFile;

    //Update description
    file1.Description = "My description";

    //Publish
    var file1ID = contentRepository.Save(file1, SaveAction.Publish);

}

The following example updates an existing file with new binary data:

C#
public void UpdatingBinary_of_a_file()
{
    var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
    var blobFactory = ServiceLocator.Current.GetInstance<BlobFactory>();

    //the file to update, not hardcoded of course
    var fileID = new ContentReference(444);

    //Get the file
    var file1 = contentRepository.Get<GenericFile>(fileID).CreateWritableClone() as GenericFile;

    //Upload new blob
    var blob = blobFactory.CreateBlob(file1.BinaryDataContainer, ".txt");
    using (var s = blob.OpenWrite())
    {
        StreamWriter w = new StreamWriter(s);
        w.WriteLine("Hello world");
        w.Flush();
    }

    //Assign to file and publish changes
    file1.BinaryData = blob;
    var file1ID = contentRepository.Save(file1, SaveAction.Publish);
}
Do you find this information helpful? Please log in to provide feedback.

Last updated: Feb 23, 2015

Recommended reading