我已经能够将一些预定的Web服务调用集成到我的Umbraco站点,该站点使用来自Web服务的响应来更新我站点上的一些内容。我现在可以处理文本和其他各种内容,但我的主要问题是如何处理以byte []格式从Web服务提供的图像?
对于一些小环境,我正在开发的网站使用Web服务调用来检索我们的桌面软件用户在其计算机上创建的产品的详细信息。这些产品中的每一个都通过Web服务调用拉入我的Umbraco站点,并在产品的父节点下创建为单独的产品页面。
Products > Product
每个产品都有几个属性,例如ID,名称,注释和图像集合。一旦我调用了我的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);
}
从代码中可以看出,每个产品都有几个与之关联的图像,我也想将其拉入网站并与正在创建的产品页面关联。我该怎么做呢?我是否需要使用媒体服务和特定数据类型,或者这种结构是否适合多媒体选择器?
答案 0 :(得分:4)
您可能会发现,一旦您检索到这些图片并为每个图片创建一个新的媒体项目,然后使用基于多媒体选择器之类的属性将其与产品相关联,就可以轻松遍历图像你注意到的数据类型。
由于此数据类型将其值存储为逗号分隔的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;
注意 - 我还没有测试过这段代码,所以ymmv。