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.
//CRM4.0: Download an Attachment
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("Pressto 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;
}
}
}