File Selection Drop Down List

blog header image

I just got a request for a code-sample on how to display a list of files from the unified file system in a drop-down list in EPiServer CMS 5, so I composed a small example (thanks for your kind help, Ruwen!).

First I define the drop-down-list - this part is easy (and boring):

<asp:DropDownList runat="server" ID="DDL1" AutoPostBack="true"  OnSelectedIndexChanged="DDL1_SelectedIndexChanged" />

When a user selects a file, I want his download to start immediately - so I set the event "OnSelectedIndexChanged" and turn on auto postback. In my code-behind I make sure to include a Using EPiServer.Web.Hosting;  cause all that's the namespace where all the fun stuff is.

Here is my code-behind:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Select the virtual path providers. Providers can be seen / defined in Web.Config.
                VirtualPathUnifiedProvider provider = (VirtualPathUnifiedProvider)VirtualPathHandler.GetProvider("SiteDocuments");
                if (provider.DirectoryExists(provider.VirtualPathRoot))
                {
                    UnifiedDirectory vdir = (UnifiedDirectory)provider.GetDirectory(provider.VirtualPathRoot);
                    DDL1.DataTextField = "Name"; //Show the filenames in the dropdown list
                    DDL1.DataValueField = "VirtualPath"; //And keep their virtual path as the key
                    DDL1.DataSource = vdir.GetFiles();
                }
                this.DataBind();
            }
            
        }

        public void DDL1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Redirect to download of file
            Response.Redirect(DDL1.SelectedValue,true);
        }

The trick is to find the right VirtualPathProvider. If you look in web.config there's a couple defined:

<virtualPath customFileSummary="~/FileSummary.config">
  <providers>
    <add showInFileManager="false" virtualName="Page Files" virtualPath="~/PageFiles/" bypassAccessCheck="false" name="SitePageFiles" type="EPiServer.Web.Hosting.VirtualPathVersioningProvider,EPiServer" indexingServiceCatalog="Web" physicalPath="%USERPROFILE%\KnowledgeWeb\PageFiles"/>
    <add showInFileManager="true" virtualName="Global Files" virtualPath="~/Global/" bypassAccessCheck="false" name="SiteGlobalFiles" type="EPiServer.Web.Hosting.VirtualPathVersioningProvider,EPiServer" indexingServiceCatalog="Web" physicalPath="%USERPROFILE%\KnowledgeWeb\Globals"/>
    <add showInFileManager="true" virtualName="Documents" virtualPath="~/Documents/" bypassAccessCheck="false" maxVersions="5" name="SiteDocuments" type="EPiServer.Web.Hosting.VirtualPathVersioningProvider,EPiServer" physicalPath="%USERPROFILE%\KnowledgeWeb\Documents"/>
  </providers>

I  use SiteDocuments, cause that's where I want to get my files from. You can of course use the VirtualPathRoot as a base to construct virtual paths to sub-folders, etc. If you want to use PageFiles, you can get the PageFolderID (which is in the path) from the PageData object.

Recent posts