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

## 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?