Выгрузка/загрузка файлов из CRM
Выгрузка приаттаченых в CRM файлов в расшаренную папку с помощью плагина
Следующий пример показывает, как программно выгрузить в какую-либо общую папку прикрепленные в CRM файлы. А в качестве объекта, к которому цепляются файлы, рассмотрим примечания (также их можно прикреплять к электропочте и литературе).
- Создайте плагин, добавьте в него ссылки на сборки из SDK и подпишите;
- В код поместите следующий фрагмент:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.Sdk.Query; using Microsoft.Crm.SdkTypeProxy; using System.Net; using System.IO; namespace ClassLibrary7 { public class Class1 : IPlugin { public void Execute(IPluginExecutionContext context) { try { // Конфигурируем CrmService CrmAuthenticationToken myToken = new CrmAuthenticationToken(); myToken.OrganizationName = "superfirma"; myToken.AuthenticationType = 0; CrmService service = new CrmService(); // Передаем учетные данные админа service.Credentials = new NetworkCredential("Administrator", "1qaz@WSX", "d2008"); service.Url = "http://win-n22hj23d1b1/MSCrmServices/2007/CrmService.asmx"; service.CrmAuthenticationTokenValue = myToken; // Запрашиваем примечание содержащее вложенный файл Guid annotationId = new Guid("{db1d584f-5743-df11-8ba8-000c29f6b309}"); // Возвращаем имя файла и его содержимое ColumnSet cols = new ColumnSet(); cols.Attributes.Add("filename"); cols.Attributes.Add("documentbody"); // Отправляем запрос в CrmService annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols); // Конвертируем содержимое файла из кодировки Base64 в byte'ы byte[] fileBuffer = Convert.FromBase64String(annotationAttachment.documentbody); // Загружаем содержимое приаттаченого файла в файл в папке temp using (FileStream fileStream = new FileStream("C:\\inetpub\\wwwroot\\ISV\\temp\\" + annotationAttachment.filename, FileMode.OpenOrCreate)) { byte[] fileContent = new UTF8Encoding(true).GetBytes(annotationAttachment.documentbody); fileStream.Write(fileContent, 0, fileContent.Length); } // Выводим сообщение об успешной выгрузке файла throw new InvalidPluginExecutionException("Файл C:\\inetpub\\wwwroot\\ISV\\temp\\" + annotationAttachment.filename + " успешно создан."); } catch (System.Web.Services.Protocols.SoapException spx) { throw new InvalidPluginExecutionException(spx.Detail.InnerText); } catch (Exception ex) { throw new InvalidPluginExecutionException(ex.ToString()); } } } }
разбор полетов:
- Для начала мы как всегда подключаемся к CRM Services;
- Затем запрашиваем имя файла и его содержимое по GUID’у Примечания, в качестве которого он загружен в CRM;
- Возвращенное содержимое мы перекодируем из Base64 в байты…
- … которые затем записываем в файл (с именем, которое мы вернули из CRM) в общедоступную папку.
- Зарегистрируйте плагин в CRM и вызовите событие на которое он зарегистрирован.
Загрузка приаттаченых в CRM файлов из отчетов
Итак, представим себе ситуацию: Вы выводите в отчете имена приаттаченых файлов и хотите, чтобы при клике на них выводолось окно предлагающее их скачать! Реализуем…
Весь подход заключается в создании ASPX-странички, которая будет принимать GUID Примечания, содержащего вложенный файл и возвращаеть его в виде файла. А в отчете мы поместим ссылку на эту ASPX-страничку с «зашитом» в URL GUID’е. Начнем:
- Создайте ASPX-страницу с таким кодом:
using System; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using Microsoft.Crm.Sdk; using Microsoft.Crm.Sdk.Query; using Microsoft.Crm.SdkTypeProxy; using System.Net; using System.Collections.Generic; using System.Text; using System.IO; using System.Web.Services.Protocols; using Microsoft.Win32; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { try { // Выполняем код под юзвером открывашем страницу using (new CrmImpersonator()) { // Проверяем что через URL передан параметр guid, иначе прекращаем выполнение if (Request.QueryString["guid"] == null) return; // Настраиваем CRM Service CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, "superfirma"); CrmService service = new CrmService(); service.CrmAuthenticationTokenValue = token; service.UseDefaultCredentials = true; // Вытаскиваем имя СRM сервера из регистра Windows service.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/crmservice.asmx"; // Кэшируем credentials, чтобы каждый запрос не проходил повторно аутентификацию service.PreAuthenticate = true; // Запрашиваем примечание с GUID'ом переданным через URL Guid annotationId = new Guid(Request.QueryString["guid"]); // Нам нужны следующие колонки: имя файла, содержимое файло и его тип ColumnSet cols1 = new ColumnSet(); cols1.Attributes.Add("filename"); cols1.Attributes.Add("documentbody"); cols1.Attributes.Add("mimetype"); // Отправляем запрос в CRM Service annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols1); // Перекодируем содержимое файла хранящееся в БД CRM из кодировки Base64 в byte... byte[] fileContent = Convert.FromBase64String(annotationAttachment.documentbody); // ... а из byte в string string s = System.Text.Encoding.Default.GetString(fileContent); // Обнуляем изначальный ответ и возвращяем ответ в виде файла Response.ClearContent(); Response.AddHeader("content-disposition", "attachment; filename=" + annotationAttachment.filename); Response.ContentType = annotationAttachment.mimetype; Response.BinaryWrite(fileContent); Response.End(); } } catch (SoapException sexc) { throw new Exception(sexc.Detail.InnerText); } catch (Exception ex) { throw new Exception(ex.Message); } } }
- Откройте файл web.config и внесите в него такие изменения:
<?xml version="1.0"?> <configuration> <appSettings/> <connectionStrings/> <system.web> <httpModules> <add name="MapOrg" type="Microsoft.Crm.MapOrgEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="CrmAuthentication" type="Microsoft.Crm.Authentication.AuthenticationEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules> <identity impersonate="true"/> <compilation debug="true"> <assemblies> <add assembly="Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="Microsoft.Crm.SdkTypeProxy, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> </system.web> </configuration>
- Теперь необходимо ее опубликовать:
- Создайте в папке ISV новую папку;
- Скопируйте в нее файлы .aspx, .aspx.cs, web.config и папку bin (чтобы упростить себе задачу, можете воспользоваться встроенным в VS функционалом по публикации веб-сайтов: в основном меню выполните команду Build — Publish Web Site — в диалоговом окне укажите путь к созданной папке и жмите ОК). Теперь наше ASPX-приложение доступно по такому URL: http://<сервер_CRM>/ISV/<имя_созданной_папи>/<имя_файла>.aspx?guid=<GUID>
А для тестирования создадим простой отчет… хотя не очень обычным способом 🙂 для его создания мы воспользуемся Report Builder’ом – постовляемой вместе с Reporting Services’ом приложением для создания отчетов (неплохая альтернатива Visual Studio):
- Откройте диспетчер отчетов Reporting Services по такой URL’е:
- http://<сервер_отчетов>/Reports
- Щелкните по кнопке Report Builder на главной странице – начнется загрузка, установка и запуск приложения Report Builder;
- Внешне Report Builder не сильно отличается от Visual Studio (если не считать Ribbon-панели), так что принцип работы тот же:
- Добавьте Датасорс на SQL сервер, который Вы используете под БД MS CRM;
- Добавьте новый Датасет с таким кодом:
select filename, CAST(annotationid AS NVARCHAR(36)) annotationid from FilteredAnnotation where filename is not NULL
- Добавьте в отчет таблицу и поместит в качестве ее содержимого поле filename;
- Откройте свойства поля таблицы и назначьте переход по гиперссылке при щелчке. А в качестве выражения подставьте примерно такой код:
="http://win-n22hj23d1b1/isv/dl/Default.aspx?guid=" + Fields!annotationid.Value
этот код формирует URL в соответствии с шаблоно который мы задали на этапе создания ASPX-странички (http://<сервер_CRM>/<имя_созданной_папи>/<имя_файла>.aspx?guid=<GUID>);
- Добавьте визуального форматирования для текста в ячейки, чтобы она больше напомниала гипперссылку.
- Сохраните отчет где-нибудь на диске. Ну, а затем создайте стандартный отчет в CRM 🙂
Привет, интересная статья.
Пользователи пользуются? Какие еще интересные решения есть, расширяющие функционал системы?
Привет 🙂
У меня нет пользователей 🙂 я в консалтинге работаю 🙂
Понял.
Какие еще интересные решения есть, расширяющие функционал системы?
Просто на словах можешь описать функционал, самому интересно в чем есть потребность
Хм… ну, например часто приходится сталкиваться к треьованием реализовать уведомления по принципу Outlook’а 🙂
Очень полезная статья, хотелось бы еще узнать способ для CRM 2011.
Код от CRM 4.0 будет работать в 2011 если обратится к предыдущему сервису.
А можно так:
http://mmcrm.ru/?p=2423
http://mmcrm.ru/?p=5425
http://mmcrm.ru/?p=1699