Skip to main content
updating code
Source Link
Ibrar Hussain
  • 2.3k
  • 14
  • 29

UPDATE

OK thanks for the comments I've updated my code to show you what I have now including the changes to the location of the component. Please see below:

    public static string Create(CoreServiceClient client, string componentId, string targetComponentLocationId)
{
    var compData = (ComponentData)client.Read(componentId, new ReadOptions());

    // Start creating component
    var component = (ComponentData)client.GetDefaultData(ItemType.Component, compData.LocationInfo.OrganizationalItem.IdRef);
    component.Id = "tcm:0-0-0";
    component.Title = compData.Title;
    component.Schema.IdRef = compData.Schema.IdRef;
    component.Content = compData.Content;

    if (!String.IsNullOrEmpty(compData.Metadata))
    {
        component.Metadata = compData.Metadata;
    }

    // Check and create binary component
    if (compData.BinaryContent != null)
    {
        string origFilename = compData.BinaryContent.Filename;
        string extension = origFilename.Substring(origFilename.LastIndexOf('.') + 1);
        string tempPath = string.Empty;

        using (var suClient = new StreamUploadClient("streamUpload_basicHttp"))
        {
            using (var sdClient = new StreamDownloadClient("streamDownload_basicHttp"))
            {
                string file = "C:\\MyTempLocation\\" + Path.GetFileName(compData.BinaryContent.Filename);

                using (var fs = File.Create(file))
                {
                    byte[] binaryContent = null;

                    var tempStream = sdClient.DownloadBinaryContent(compData.Id);
                    var memoryStream = new MemoryStream();
                    tempStream.CopyTo(memoryStream);
                    binaryContent = memoryStream.ToArray();

                    tempPath = suClient.UploadBinaryContent(origFilename, memoryStream);
                }
            }
        }

        // Find multimedia type
        var list = client.GetSystemWideList(new MultimediaTypesFilterData());
        var multimediaType = list.OfType<MultimediaTypeData>().Single(mt => mt.FileExtensions.Contains(extension));

        // Set binary content of component
        component.BinaryContent = new BinaryContentData
        {
            UploadFromFile = tempPath,
            Filename = origFilename,
            MultimediaType = new LinkToMultimediaTypeData { IdRef = multimediaType.Id }
        };
    }

    component.LocationInfo = new LocationInfo
    {
        OrganizationalItem = new LinkToOrganizationalItemData
        {
            IdRef = targetComponentLocationId
        }
    };

    try
    {
        component = (ComponentData)client.Create(component, new ReadOptions());
    }
    catch (Exception ex)
    {
        _log.ErrorFormat("Unable to create component: {0}", ex);
    }

    return component.Id;
}

When I run this it does work but when I go into Tridion and open up the binary component I see the following message in the preview

HTTP 404: File not found, reverting to mimetype

I'm pretty sure I've seen Tridion do this before but even when I go to C:\\MyTempLocation\\ I try opening the binary and its empty.

Can anyone see a problem with my approach here?

UPDATE

OK thanks for the comments I've updated my code to show you what I have now including the changes to the location of the component. Please see below:

    public static string Create(CoreServiceClient client, string componentId, string targetComponentLocationId)
{
    var compData = (ComponentData)client.Read(componentId, new ReadOptions());

    // Start creating component
    var component = (ComponentData)client.GetDefaultData(ItemType.Component, compData.LocationInfo.OrganizationalItem.IdRef);
    component.Id = "tcm:0-0-0";
    component.Title = compData.Title;
    component.Schema.IdRef = compData.Schema.IdRef;
    component.Content = compData.Content;

    if (!String.IsNullOrEmpty(compData.Metadata))
    {
        component.Metadata = compData.Metadata;
    }

    // Check and create binary component
    if (compData.BinaryContent != null)
    {
        string origFilename = compData.BinaryContent.Filename;
        string extension = origFilename.Substring(origFilename.LastIndexOf('.') + 1);
        string tempPath = string.Empty;

        using (var suClient = new StreamUploadClient("streamUpload_basicHttp"))
        {
            using (var sdClient = new StreamDownloadClient("streamDownload_basicHttp"))
            {
                string file = "C:\\MyTempLocation\\" + Path.GetFileName(compData.BinaryContent.Filename);

                using (var fs = File.Create(file))
                {
                    byte[] binaryContent = null;

                    var tempStream = sdClient.DownloadBinaryContent(compData.Id);
                    var memoryStream = new MemoryStream();
                    tempStream.CopyTo(memoryStream);
                    binaryContent = memoryStream.ToArray();

                    tempPath = suClient.UploadBinaryContent(origFilename, memoryStream);
                }
            }
        }

        // Find multimedia type
        var list = client.GetSystemWideList(new MultimediaTypesFilterData());
        var multimediaType = list.OfType<MultimediaTypeData>().Single(mt => mt.FileExtensions.Contains(extension));

        // Set binary content of component
        component.BinaryContent = new BinaryContentData
        {
            UploadFromFile = tempPath,
            Filename = origFilename,
            MultimediaType = new LinkToMultimediaTypeData { IdRef = multimediaType.Id }
        };
    }

    component.LocationInfo = new LocationInfo
    {
        OrganizationalItem = new LinkToOrganizationalItemData
        {
            IdRef = targetComponentLocationId
        }
    };

    try
    {
        component = (ComponentData)client.Create(component, new ReadOptions());
    }
    catch (Exception ex)
    {
        _log.ErrorFormat("Unable to create component: {0}", ex);
    }

    return component.Id;
}

When I run this it does work but when I go into Tridion and open up the binary component I see the following message in the preview

HTTP 404: File not found, reverting to mimetype

I'm pretty sure I've seen Tridion do this before but even when I go to C:\\MyTempLocation\\ I try opening the binary and its empty.

Can anyone see a problem with my approach here?

Tweeted twitter.com/#!/StackTridion/status/329744364207230976
edited title
Link
Ibrar Hussain
  • 2.3k
  • 14
  • 29

Creating Binary ComponentComponents using the Core Service

Source Link
Ibrar Hussain
  • 2.3k
  • 14
  • 29

Creating Binary Component using Core Service

I'm trying to create a copy of an existing component using the core service which has worked fine up until I hit a binary component when running my console app.

To give you an example of what my code is doing you can see below that I check .BinaryContent and then try to build up the properties before creating the component.

public static string Create(CoreServiceClient client, string componentId)
{
var compData = (ComponentData)client.Read(componentId, new ReadOptions());

var component = (ComponentData)client.GetDefaultData(ItemType.Component, compData.LocationInfo.OrganizationalItem.IdRef);
component.Id = "tcm:0-0-0";
component.Title = compData.Title;
component.Schema.IdRef = compData.Schema.IdRef;
component.Content = compData.Content;
component.Metadata = compData.Metadata

if (compData.BinaryContent != null)
{
    component.BinaryContent = new BinaryContentData
    {
        UploadFromFile = compData.BinaryContent.UploadFromFile,
        Filename = compData.BinaryContent.Filename,
        MultimediaType = new LinkToMultimediaTypeData()
        {
            IdRef = compData.BinaryContent.MultimediaType.IdRef
        }
    };
}

try
{
    component = (ComponentData)client.Create(component, new ReadOptions());
}
catch (Exception ex)
{
    _log.ErrorFormat("Unable to create component: {0}", ex);
}

return component.Id;
}

However, I'm getting the following error:

System.ServiceModel.FaultException`1[BlueprintTool.Data.CoreService.CoreServiceFault]: Invalid value for property 'BinaryContent'. Neither value for UploadFromFile property nor UploadFromStream is provided for item (Fault Detail is equal to BlueprintTool.Data.CoreService.CoreServiceFault).

Do I need to provide a path for the binary? Can anyone see where I am going wrong?

Thanks