简体   繁体   English

以编程方式创建和存储从Web服务检索为byte []数据的图像作为Umbraco中的媒体项

[英]Programmatically create and store images retrieved as byte[] data from a web service as media items in Umbraco

I've been able to integrate some scheduled web service calls into my Umbraco site that uses the response from the web service to update some of the content on my site. 我已经能够将一些预定的Web服务调用集成到我的Umbraco站点,该站点使用来自Web服务的响应来更新我站点上的一些内容。 I can now handle text and some various other content but my main query is how should I deal with images that are delivered from the web service in byte[] format? 我现在可以处理文本和一些其他各种内容,但我的主要问题是我应该如何处理以byte []格式从Web服务提供的图像?

For a little context, the site I am developing uses web service calls to retreive the details of a product which users of our desktop software have created on their machine. 对于一些小环境,我正在开发的网站使用Web服务调用来检索我们的桌面软件用户在其计算机上创建的产品的详细信息。 Each of these products is pulled via a web service call into my Umbraco site and created as an individual product page under the parent node of products. 这些产品中的每一个都通过Web服务调用拉入我的Umbraco站点,并在产品的父节点下创建为单独的产品页面。

Products > Product

Each product has several properties such as an ID, a name, notes and a collection of images. 每个产品都有几个属性,如ID,名称,注释和图像集合。 Once I have called my web service I am creating these pages using the following code: 一旦我调用了我的Web服务,我就会使用以下代码创建这些页面:

//Construct Service Request
    svc = new StaticDataWebServiceSoapClient();
    var response = svc.GetProducts(ref compressionSoapHeader,ref managedUserHeader);

    //Umbraco Content Services
    int rootID = 1117;
    IContentService cs = ApplicationContext.Current.Services.ContentService;
    var remove = cs.GetChildren(rootID).Where(x => x.ContentType.Alias == "product");
    foreach (var child in remove)
    {
      cs.Delete(child);
    }
    foreach(var product in response){
      var item = cs.CreateContent(product.ContinentName, rootID, "product");
      //Set the properties using the SetValue method, passing in the alias of the property and the value to assign to it
      item.SetValue("continentId", product.Id);
      item.SetValue("continentName", product.ProductName);
      item.SetValue("continentNotes", product.Notes);
      foreach (var image in product.Images)
      {
        ??? destination.SetValue("ProductImages", image._Image); ???
        image.Caption;
        image.FileName;
        image.ImageId;
        image.KeywordID;
      }
      cs.SaveAndPublishWithStatus(item);
    }

As you can see from the code, each product has several images associated with it that I would also like to pull into the site and associate with the product page that is being created. 从代码中可以看出,每个产品都有几个与之关联的图像,我也想将其拉入网站并与正在创建的产品页面关联。 How would I go about doing this? 我该怎么做呢? Would I need to use the Media Service and a specific datatype or would this structure fit easily into a multiple media picker? 我是否需要使用媒体服务和特定数据类型,或者这种结构是否适合多媒体选择器?

You may find it easiest to loop through the images once you've retrieved them and create a new Media item for each of them, and then associate them with the product using a property based on something like the Multiple Media Picker datatype as you noted. 一旦您检索到图像并为每个图像创建一个新的Media项目,您可能会发现最简单的方法是循环浏览图像,然后使用基于您所记录的多媒体选择器数据类型之类的属性将它们与产品相关联。

Because this data type stores it's values as a comma separated list of id's you could use something like the following: 由于此数据类型将其值存储为逗号分隔的id列表,因此您可以使用以下内容:

        // Setup
        IContentService cs = ApplicationContext.Current.Services.ContentService;
        var mediaService = ApplicationContext.Current.Services.MediaService;
        int mediaRootId = 1111; // Replace with the id of your media parent folder


        // Replace the image looping logic with the following:

        // MultiMediaPicker stores it's values as a commma separated string of ids.
        string imageIds = string.Empty;

        foreach (var image in product.Images)
        {
            var fileName = image.FileName; // Assumes no path information, just the file name
            var ext = fileName.Substring(fileName.LastIndexOf('.') + 1).ToLower();

            if (!UmbracoConfig.For.UmbracoSettings().Content.DisallowedUploadFiles.Contains(ext))
            {
                var mediaType = Constants.Conventions.MediaTypes.File;

                if (UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.Contains(ext))
                    mediaType = Constants.Conventions.MediaTypes.Image;

                var f = mediaService.CreateMedia(fileName, mediaRootId, mediaType);
                // Assumes the image._Image is a Stream - you may have to do some extra work here...
                f.SetValue(Constants.Conventions.Media.File, fileName, (Stream)image._Image); // Real magic happens here.

                mediaService.Save(f);

                imageIds += (imageIds.Length > 0 ? "," : "") + f.Id;
            }
        }

        // Get the relevant property on the new item and save the image list to it.
        var imagesProp = item.Properties.Where(p => p.Alias == "productImages").FirstOrDefault();
        imagesProp.Value = imageIds;

Note - I haven't tested this code out, so ymmv. 注意 - 我没有测试过这个代码,所以ymmv。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM