Download an Attachment

banner art

[Applies to: Microsoft Dynamics CRM 4.0]

Find the latest SDK documentation: CRM 2015 SDK

The following code example demonstrates how to download an attachment programmatically. This technique is demonstrated for a note (annotation), an e-mail attachment (activitymimeattachment), and for a sales literature item. You can use the same technique for downloading an e-mail template.

[C#]
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
using Microsoft.Crm.Sdk.Utility;
using System.Web.Services.Protocols;

namespace Microsoft.Crm.Sdk.HowTo
{
    // Use the following Microsoft Dynamics CRM namespaces in the sample.
    using CrmSdk;

    class DownloadAttachment
    {
        static void Main(string[] args)
        {
            bool success = false;
            try
            {
                // TODO: Change the service URL and organization to match your Microsoft Dynamics
                // CRM server installation. A value of String.Empty for the service URL indicates
                // to use the default service URL defined in the WSDL.
                success = DownloadAttachment.Run("http://localhost:5555", "CRM_Organization");
            }
            catch (SoapException ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.Detail.InnerText);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine(ex.Message);

                // Display the details of the inner exception.
                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);

                    SoapException se = ex.InnerException as SoapException;
                    if (se != null)
                        Console.WriteLine(se.Detail.InnerText);
                }
            }
            finally
            {
                Console.WriteLine("Completed successfully? {0}", success);
                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }
        }

        public static bool Run(string crmServerUrl, string orgName)
        {

            bool success = false;
            
            try
            {
                // Set up the CRM Service.
                CrmService service = CrmServiceUtility.GetCrmService(crmServerUrl, orgName);
                // Cache credentials so each request does not have to be authenticated again.
                service.PreAuthenticate = true;

                #region Setup Data Required for this Sample

                // Create the root account.
                Guid setupAnnotationId = Guid.Empty;
                Guid setupEmailAttachmentId = Guid.Empty;
                Guid setupEmailId = Guid.Empty;
                Guid setupSalesLiteratureId = Guid.Empty;
                Guid setupSalesLiteratureItemId = Guid.Empty;

                // Create the annotation record.
                annotation setupAnnotation = new annotation();
                setupAnnotation.subject = "Example Annotation Attachment";
                setupAnnotation.filename = "ExampleAnnotationAttachment.txt";
                setupAnnotation.documentbody = "Sample Annotation Text";
                setupAnnotationId = service.Create(setupAnnotation);

                // Create the e-mail record.
                email setupEmail = new email();
                setupEmail.subject = "Example email";
                setupEmail.torecipients = "unknown@example.com";
                setupEmail.description = "This is an example email.";
                setupEmailId = service.Create(setupEmail);
                                
                // Create the activitymimeattachment record for an e-mail attachment.
                activitymimeattachment setupEmailAttachment = new activitymimeattachment();
                setupEmailAttachment.subject = "Example Email Attachement";
                setupEmailAttachment.filename = "ExampleEmailAttachment.txt";
                setupEmailAttachment.body = "Some Text";
                setupEmailAttachment.mimetype = "text/plain";
                setupEmailAttachment.attachmentnumber = new CrmNumber();
                setupEmailAttachment.attachmentnumber.Value = 1;
                setupEmailAttachment.activityid = new Lookup();
                setupEmailAttachment.activityid.type = EntityName.email.ToString();
                setupEmailAttachment.activityid.Value = setupEmailId;
                setupEmailAttachmentId = service.Create(setupEmailAttachment);

                // Create the salesliterature record.
                salesliterature attachment3 = new salesliterature();
                attachment3.name = "Example SalesLiterature";
                attachment3.hasattachments = new CrmBoolean();
                attachment3.hasattachments.Value = true;
                setupSalesLiteratureId = service.Create(attachment3);
                
                // Create the salesliteratureitem record for an attachment to salesliterature.
                salesliteratureitem attachementItem3 = new salesliteratureitem();
                attachementItem3.title = "Example sales literature attachment";
                attachementItem3.filename = "ExampleSalesLiteratureAttachment.txt";
                attachementItem3.documentbody = "Example sales literature text.";
                attachementItem3.mimetype = "text/plain";
                attachementItem3.salesliteratureid = new Lookup();
                attachementItem3.salesliteratureid.type = EntityName.salesliterature.ToString();
                attachementItem3.salesliteratureid.Value = setupSalesLiteratureId;
                setupSalesLiteratureItemId = service.Create(attachementItem3);                

                #endregion                

                #region How to download attachment from annotation record 
                
                // SDK: annotationId = new Guid("{bee08735-09d3-de11-9d71-00155da4c706}");
                Guid annotationId = setupAnnotationId;

                // Define the columns to retrieve from the annotation record.
                ColumnSet cols1 = new ColumnSet();
                cols1.Attributes = new string[] { "filename", "documentbody" };

                // Retrieve the annotation record.
                annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols1);

                // Download the attachment in the current execution folder.
                using (FileStream fileStream = new FileStream(annotationAttachment.filename, FileMode.OpenOrCreate))
                {
                    byte[] fileContent = new UTF8Encoding(true).GetBytes(annotationAttachment.documentbody);
                    fileStream.Write(fileContent, 0, fileContent.Length);
                }

                #endregion

                #region How to download attachment from activitymimeattachment record

                // SDK: emailAttachmentId = new Guid("{c1e08735-09d3-de11-9d71-00155da4c706}");
                Guid emailAttachmentId = setupEmailAttachmentId;

                // Define the columns to retrieve from the activitymimeattachment record.
                ColumnSet cols2 = new ColumnSet();
                cols2.Attributes = new string[] { "filename", "body" };

                // Retrieve the activitymimeattachment record.
                activitymimeattachment emailAttachment = (activitymimeattachment)service.Retrieve(EntityName.activitymimeattachment.ToString(), emailAttachmentId, cols2);

                // Download the attachment in the current execution folder.
                using (FileStream fileStream = new FileStream(emailAttachment.filename, FileMode.OpenOrCreate))
                {
                    // byte[] fileContent = Convert.FromBase64String(emailAttachment.body);
                    byte[] fileContent = new UTF8Encoding(true).GetBytes(emailAttachment.body);
                    fileStream.Write(fileContent, 0, fileContent.Length);
                }

                #endregion

                #region How to download attachment from salesliterature record

                // SDK: salesLiteratureId = new Guid("{a836993e-09d3-de11-9d71-00155da4c706}");
                Guid salesLiteratureId = setupSalesLiteratureId;

                // Search for all the salesliteratureitem records that belong 
                // to the specified salesliterature record. 
                BusinessEntityCollection entities = null;
                salesliteratureitem entity = null;

                // Create the query for search.
                QueryExpression query = new QueryExpression();
                query.EntityName = EntityName.salesliteratureitem.ToString();

                // Define the columns to retrieve from the salesliteratureitem record.    
                ColumnSet cols3 = new ColumnSet();
                cols3.Attributes = new string[] { "filename", "documentbody", "title" };

                // Set the filter condition to query.
                ConditionExpression condition = new ConditionExpression();
                condition.AttributeName = "salesliteratureid";
                condition.Values = new string[1] { salesLiteratureId.ToString() };
                condition.Operator = ConditionOperator.Equal;
                FilterExpression filter = new FilterExpression();
                filter.Conditions = new ConditionExpression[] { condition };
                
                query.ColumnSet = cols3;
                query.Criteria = filter;

                // Retrieve the salesliteratureitem records.
                entities = service.RetrieveMultiple(query);

                // Check for the retrieved salesliteratureitem count.
                if (entities.BusinessEntities.Length != 0)
                {
                    for (int i = 0; i < entities.BusinessEntities.Length; i++)
                    {
                        entity = (salesliteratureitem)entities.BusinessEntities[i];

                        // Download the attachment in the current execution folder.
                        using (FileStream fileStream = new FileStream(entity.filename, FileMode.OpenOrCreate))
                        {
                            byte[] fileContent = new UTF8Encoding(true).GetBytes(entity.documentbody);
                            fileStream.Write(fileContent, 0, fileContent.Length);
                        }
                    }
                }

                #endregion

                #region check success

                // Verify that there are attachments.
                if (annotationAttachment.filename != null && emailAttachment.filename != null 
                   && entity.filename != null)
                {
                    success = true;
                    Console.WriteLine(
                        "The following files were downloaded to the executable folder:\n {0}\n {1}\n {2}\n", 
                        annotationAttachment.filename, emailAttachment.filename, entity.filename);
                }
                #endregion

                #region Remove Data Required for this Sample

                service.Delete(EntityName.annotation.ToString(), setupAnnotationId);                
                service.Delete(EntityName.activitymimeattachment.ToString(), setupEmailAttachmentId);                
                service.Delete(EntityName.email.ToString(), setupEmailId);
                service.Delete(EntityName.salesliteratureitem.ToString(), setupSalesLiteratureItemId);
                service.Delete(EntityName.salesliterature.ToString(), setupSalesLiteratureId);
                                
                #endregion

            }
            catch
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
            
            return success;
        }

    }
}

See Also

Reference

© 2010 Microsoft Corporation. All rights reserved.