Fermer

août 31, 2022

Livraison d’éléments multimédias Sitecore sous forme de ZIP compressé

Livraison d’éléments multimédias Sitecore sous forme de ZIP compressé


La tâche à accomplir

À un moment donné, en tant que développeur, vous devrez peut-être combiner plusieurs Médiathèque Sitecore éléments dans un ZIP compressé et le livrer à la volée à l’utilisateur final. Dans cet article, je vais documenter comment j’ai abordé cette tâche en utilisant une route personnalisée dans .NET prise en charge par un ActionRésultat dans un Contrôleur.

Dans mon scénario, j’avais un élément Sitecore auquel était attachée une liste d’images. Mon objectif était de prendre cette liste et d’en créer un fichier zip. Même si j’utilisais une liste qui permettait une mise à jour facile dans l’interface utilisateur, si nous passons aux valeurs brutes, nous verrons quelque chose de similaire à ceci :

Imagerawvalues

Sitecore combine les éléments de la liste et les concatène avec un tube pour la séparation entre les GUID. Sachant cela, nous pouvons cibler ce champ et faire une scission sur le tuyau. À partir de là, nous pouvons poursuivre le travail d’emballage des fichiers. La première étape pour moi était de créer un nouveau gestionnaire qui serait capable de prendre un ID d’un élément, puis d’analyser ce champ afin que je sache quels éléments emballer.

Création d’une Route personnalisée et d’un ActionResult

Sitecore - Comprendre les approches de développement : une perspective de Sitecore

Voici un exemple de route personnalisée vers une action de contrôleur :

routes.MapRoute("Download", "download /{ItemId}", new { controller = "Media", action = "Download" }, new string[] { @"MySite.Controllers" });

Ensuite, dans mon contrôleur, je peux créer un ActionResult pour obtenir les valeurs avec lesquelles nous cherchons à travailler :

public ActionResult Download(string itemId)
{
    var parentItem = _scHelper.GetItem(itemId);
    var imageItems = parentItem.Fields[“YOUR_FIELD_GUID”].Value.Split('|');
    return Content(“OK”);
}

Nous ne renvoyons qu’une chaîne à ce stade, mais nous avons le code en place pour savoir avec quels éléments nous aimerions travailler. Nous pouvons ensuite faire un foreach pour la variable imageItems pour récupérer les données dont nous avons besoin à partir du MediaManager et les ajouter au fichier zip que nous créons. Tout d’abord, nous voudrons créer un MemoryStream pour nous de travailler avec, puis en utilisant ce flux, nous pouvons créer un ZipArchive pour nos fichiers.

Création du flux de mémoire et du fichier ZIP

Voici comment nous pouvons créer un MemoryStream, y ajouter un fichier ZIP et le renvoyer sous forme de fichier :

using (System.IO.MemoryStream zipStream = new System.IO.MemoryStream())
{
    using (System.IO.Compression.ZipArchive zip = new System.IO.Compression.ZipArchive(zipStream, System.IO.Compression.ZipArchiveMode.Create, true))
    {
        // We can add our files here
    }

    // Create a byte array to convert our stream to
    Byte[] bytes = zipStream.ToArray();

    // Deliver the array as a file
    return File(bytes, "application/zip", "YourCompressedFile.zip");
}

Inclure les fichiers que nous voulons dans notre ZIP

À ce stade, nous savons quels fichiers nous voulons inclure et nous avons un fichier ZIP vierge. Il ne nous reste plus qu’à parcourir la liste des images, à récupérer leurs données sur Sitecore et à les inclure dans le fichier ZIP que nous sommes en train de créer.

On peut récupérer les données des images avec le MediaManager de Sitecore :

foreach (var image in imageItems)
{
    var mediaItem = (MediaItem)_scHelper.GetItem(image);
    var media = MediaManager.GetMedia(mediaItem);
    var stream = media.GetStream().Stream;
    var extension = mediaItem.Extension;

    if (String.IsNullOrEmpty(extension)) continue;

    ZipArchiveEntry zipItem = zip.CreateEntry(mediaItem.Name + "." + extension);

    using (System.IO.Stream entryStream = zipItem.Open())
    {
        stream.CopyTo(entryStream);
    }
}

C’est si facile! Le code devrait probablement être mis à jour pour ajouter un peu de gestion des erreurs et vous voudrez probablement un meilleur nom que YourCompressedFile.zip comme nom de votre fichier. J’espère que cela vous a donné une idée de la façon dont vous pouvez tirer parti des valeurs brutes et du MediaManager de Sitecore pour faire gagner du temps à vos utilisateurs en leur permettant de télécharger un seul fichier au lieu de plusieurs téléchargements.






Source link