How to generate media item link with id instead of

2019-06-23 05:00发布

问题:

Anyone knows how to generate links in sitecore with ID instead of item path?

If you use GetMediaUrl method from the API, I can get this URL:

/~/media/Images/Archive/content/News and Events/News_and_Events_Level2/20070419162739/iwhiz3.jpg

The problem with this approach is that if someone changes the media item name, removes it somewhere or deletes it, the above link will break.

I notice if I insert a media link from rich text editor, I get the link as below:

/~/media/14BDED00E4D64DFD8F74019AED4D74EB.ashx

The second link is better because it's using the item id, so if the actual media item is renamed, removed, or deleted, all related links will be updated too. On top of that, when Sitecore renders the page, it will actually convert the above link and display the item path so it's readable.

I'm using Sitecore 6.5 and currently doing content migration so I need to make sure all internal links are updated properly.

May I know if there is a method to generate the second link by using sitecore API?

Thanks!

回答1:

The GetMediaItemUrl extension method seems to give you what you want.

public static class ItemExtensions
{
    public static string GetMediaItemUrl(this Item item)
    {
        var mediaUrlOptions = new MediaUrlOptions() { UseItemPath = false, AbsolutePath = true };
        return Sitecore.Resources.Media.MediaManager.GetMediaUrl(item, mediaUrlOptions);
    }
}

[TestFixture]
public class when_using_items_extensions
{
    [Test]
    public void a_url_based_on_media_item_id_can_be_generated()
    {
        // Arrange
        Database db = global::Sitecore.Configuration.Factory.GetDatabase("master");
        Item item = db.GetItem("/sitecore/media library/Images/MyImage");

        // Act
        var mediaUrl = item.GetMediaItemUrl();

        // Assert
        Assert.That(mediaUrl, Is.EqualTo("/~/media/17A1341ABEEC46788F2159843DCEAB03.ashx"));
    }
}


回答2:

These are called dynamic links and you can normally generate them using the LinkManager e.g:

Sitecore.Links.LinkManager.GetDynamicUrl(item)

.. but I'm not sure of the method to do this with Media links (there probably is one but I cant seem to find it and its not on MediaManager) but the basic syntax is:

"/~/media/" + item.ID.ToShortID() + ".ashx"



回答3:

If you always want to use ID's instead of paths, you can change this setting in webconfig to false (like this):

<setting name="Media.UseItemPaths" value="false"/>`

Here is what the webconfig describes about it:

 MEDIA - USE ITEM PATHS FOR URLS
 This setting controls if item paths are used for constructing media URLs.
 If false, short ids will be used.
       Default value: true

Then you can use the default implementation (without additional parameters):

Sitecore.Resources.Media.MediaManager.GetMediaUrl(item);


回答4:

This is what I use:

var imgField = ((Sitecore.Data.Fields.ImageField)currentItem.Fields["Icon"]);
MediaUrlOptions opt = new MediaUrlOptions();
opt.AlwaysIncludeServerUrl = true;
// Absolute Path works as well. So either use AbsolutePath or AlwaysIncludeServerUrl
opt.AbsolutePath = true;
string mediaUrl = MediaManager.GetMediaUrl(imgField.MediaItem, opt);