How to find an Image by the MediaURL using FluentApi - Front- & Back-End Development - Front- & Back-End Development - Progress Community
 Front- & Back-End Development

How to find an Image by the MediaURL using FluentApi

  • How to find an Image by the MediaURL using FluentApi
  • Hi,

    I have implemented the following Fluent API query to find an image uploaded to Sitefinity by the media URL. For some reason it's throwing an exception (see below). Can someone please tell me what I have done wrong here and is it possible to find an image by the media URL?

    string mediaURL =  "/images/headshots/2011/03/21/17665.jpg" //This is the relative path of the image uploaded
    Telerik.Sitefinity.Libraries.Model.Image image = App.WorkWith()
                        .Where(i => i.MediaUrl == medilURL
                            && i.Status == ContentLifecycleStatus.Live)

    Field "MediaUrl" not found in Class Telerik.Sitefinity.Libraries.Model.Image. MediaUrl ["MediaUrl",<42>,line=1,col=125]
    Original Query: DEFINE EXTENT extnt FOR Telerik.Sitefinity.Libraries.Model.Image; SELECT * FROM extnt AS t1  WHERE t1.appName =  $1 AND (t1.MediaUrl =  $2 AND t1.status =  $3 )

  • It seems like a bug in the fluent API to me, but to get around it I get all the content items from the API and then filter the list with another linq query.  For example:

    IEnumerable<Telerik.Sitefinity.Libraries.Model.Image> images = App.WorkWith()
                        .Where(i => i.Status == ContentLifecycleStatus.Live)
    Telerik.Sitefinity.Libraries.Model.Image image = images.
                        .Where(i => i.MediaUrl == mediaURL)
  • Hi ,

    The problems stems from the fact that MediaUrl is a helper field that is not persisted. What you are executing would eventually go to the ORM. It will try query the database, but it has no information about 'MediaUrl', what it maps to, what table to get it from, etc. Therefore, OpenAccess spawns an error message as a result of its confusion.

    Since this is a common task, you have a utility method for all content managers -

    public virtual IDataItem GetItemFromUrl(Type itemType, string url, bool published, out string redirectUrl)

    A few notes about the url - it should be rooted local path, or put simply, out of the the
    you need only the /images/image.png part

    itemType, for images, is typeof(Image). Published should be true, and redirectUrl can be ignored for this example.

    A method that 'soften'-s this procedure would look something like
    protected MediaContent GetMediaContentFromUrl(string path)
        if (string.IsNullOrWhiteSpace(path))
            return null;
        Uri uri;
        if (!Uri.TryCreate(path, UriKind.RelativeOrAbsolute, out uri))
            return null;            
        if (uri.IsAbsoluteUri)
            path = uri.LocalPath;            
        if (VirtualPathUtility.IsAppRelative(path))
            path = VirtualPathUtility.ToAbsolute(path);
        if (path.Length <= 1)
            return null;
        path = path.Substring(1);
        var imagesRoot = Config.Get<LibrariesConfig>().Images.UrlRoot;
        var documentsRoot = Config.Get<LibrariesConfig>().Documents.UrlRoot;
        var videosRoot = Config.Get<LibrariesConfig>().Videos.UrlRoot;
        Type contentType = null;
        int indx = path.IndexOf('/');
        int rootIndex = indx;
        if (indx != -1)
            string libraryType = path.Substring(0, indx);           
            if (libraryType == imagesRoot)
                contentType = typeof(Image);
            else if (libraryType == documentsRoot)
                contentType = typeof(Document);
            else if ((libraryType == videosRoot))
                contentType = typeof(Video);                
        if (contentType == null)
            return null;
        indx = path.LastIndexOf('.');
        if (indx != -1)
            bool showThumbnail = false;
            string extension = path.Substring(indx);
            path = path.Substring(0, indx);
            if (extension.Equals(".tmb", StringComparison.OrdinalIgnoreCase))
                indx = path.LastIndexOf('.');
                if (indx == -1)
                    return null;
                extension = path.Substring(indx);
                path = path.Substring(0, indx);
                showThumbnail = true;
            LibrariesManager manager = LibrariesManager.GetManager();
            indx = path.IndexOf('/', rootIndex + 1);
            if (indx != -1)
                string providerName = path.Substring(rootIndex + 1, indx - rootIndex - 1);
                if (manager.Providers.Contains(providerName))
                    manager = LibrariesManager.GetManager(providerName);
                    //path = path.Substring(indx);
            if (!path.StartsWith("/"))
                path = "/" + path;
            string redirectUrl;
            MediaContent content = (MediaContent)manager.GetItemFromUrl(contentType, path, true, out redirectUrl);
            return content;
        return null;

    Please note that his method is rather generic and that is why it is that long.

    All the best,
    the Telerik team
  • Dido,

    I have the MediaUrl value. All I want to do is to invoke that document.
    I don't want the user to be taken off to another page.

    In simple terms:
     - I have a button on the screen.
    - I know the MediaUrl.

    All I want is for the user to click that button and the
    Word to start up separately displaying that document without navigating to another

    Is there a way with the Telerik API to just say do that.

    Currently, I have an iFrame to which I give the MediaUrl as the src
    but I want to do it without the iFrame.

  • I think I worked it out.
    I have "Response.Redirect(ResolveUrl(doc.MediaUrl));" 
    and seems to work. It opens Word separately and
    leaves me on the same page.

    But let me know if there is a better way.

    Still need to test it though.

  • Above GetMediaContentFromUrl method is not working correctly in Sitefinity 4.4
    It is passing URLs in format: "/library/image.jpg" to GetItemFromUrl and the result is null.

    In version 4.4 you need to shorten it a little bit more. When you pass URL in format "/library/image" (without file extension) it returns correct value.
  • UPDATE: Sorry. Double post.