Как кодировать и декодировать вложенный файл программно, используя Visual C# в InfoPath

Переводы статьи Переводы статьи
Код статьи: 892730 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В Microsoft Office InfoPath 2007 или Microsoft Office InfoPath 2003 с пакетом обновления 1 (SP1), можно использоватьВложение файлаэлемент управления , чтобы вложить файл в шаблон формы InfoPath. В определенных случаях может потребоваться кодирования и затем декодировать файл, который присоединяется кВложение файлаэлемент управления . В этом случае можно использовать Microsoft Visual C# для созданияКодировщикакласса иДекодерКласс . Затем можно использоватьКодировщикакласса иДекодеркласс для кодирования и декодирования файла вложения.

Введение

В данной статье представлены способы кодирования и декодирования вложенный файл программно с помощью Microsoft Visual C#.

Дополнительная информация

Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации и или подразумеваемых. Включая, но не ограничивая, подразумеваемые гарантии товарности или пригодности для использования в определенных целях.. В данной статье предполагается, что вы знакомы с языком программирования предложенном в примере, а также с средствами, которые используются для создания и отладки.. Сотрудники службы поддержки Майкрософт могут объяснить возможности конкретной процедуры, но не выполнять модификации примеров для обеспечения функциональных возможностей или создания процедур соответствующих определенным требованиям..

Создание проекта Visual C# в InfoPath 2003

  1. Запустить Microsoft Visual Studio .NET 2003.
  2. НаФайлменю, нажмите кнопкуНовый, а затем нажмите кнопкуПроект.
  3. ВСоздание проектадиалоговое окно, нажмите кнопкуПроекты Visual C#в Microsoft Office InfoPath проектами папки.
  4. ВИмяполе, типAttachmentEncoding, а затем нажмите кнопкуОК.
  5. В Microsoft Office Project мастере нажмите кнопкуСоздание нового шаблона формы, а затем нажмите кнопкуОкончание.

    В мастере проектов Microsoft Office создает новый проект Visual Studio .NET 2003, который называется AttachmentEncoding. Создается шаблон формы InfoPath. Шаблон формы InfoPath называется AttachmentEncoding.

Создать класс кодировщика в Visual Studio .NET 2003

  1. В обозревателе решений щелкните правой кнопкой мышиAttachmentEncodingи выберите последовательно пунктыДобавить, а затем нажмите кнопкуДобавление нового элемента.
  2. ВДобавление нового элементадиалоговое окно, нажмите кнопкуКлассвШаблонобласти, введитеInfoPathAttachmentEncoder.csвИмяв поле и нажмите кнопкуОткрыть.
  3. Замените весь код InfoPathAttachmentEncoder.cs файл со следующим кодом.
    using System;
    using System.IO;
    using System.Text;
    using System.Security.Cryptography;
    
    namespace InfoPathAttachmentEncoding
    {
    	/// <summary>
    	/// InfoPathAttachment encodes file data into the format expected by InfoPath for use in file attachment nodes.
    	/// </summary>
    	public class InfoPathAttachmentEncoder
    	{
    		private string base64EncodedFile = string.Empty;
    		private string fullyQualifiedFileName;
    
    		/// <summary>
    		/// Creates an encoder to create an InfoPath attachment string.
    		/// </summary>
    		/// <param name="fullyQualifiedFileName"></param>
    		public InfoPathAttachmentEncoder(string fullyQualifiedFileName)
    		{
    			if (fullyQualifiedFileName == string.Empty)
    				throw new ArgumentException("Must specify file name", "fullyQualifiedFileName");
    
    			if (!File.Exists(fullyQualifiedFileName))
    				throw new FileNotFoundException("File does not exist: " + fullyQualifiedFileName, fullyQualifiedFileName);
    
    			this.fullyQualifiedFileName = fullyQualifiedFileName;
    		}
    
    		/// <summary>
    		/// Returns a Base64 encoded string.
    		/// </summary>
    		/// <returns>String</returns>
    		public string ToBase64String()
    		{
    			if (base64EncodedFile != string.Empty)
    				return base64EncodedFile;
    
    			// This memory stream will hold the InfoPath file attachment buffer before Base64 encoding.
    			MemoryStream ms = new MemoryStream();
    
    			// Get the file information.
    			using (BinaryReader br = new BinaryReader(File.Open(fullyQualifiedFileName, FileMode.Open, FileAccess.Read, FileShare.Read)))
    			{
    				string fileName = Path.GetFileName(fullyQualifiedFileName);
    
    				uint fileNameLength = (uint)fileName.Length + 1;
    
    				byte[] fileNameBytes = Encoding.Unicode.GetBytes(fileName);
    
    				using (BinaryWriter bw = new BinaryWriter(ms))
    				{
    					// Write the InfoPath attachment signature. 
    					bw.Write(new byte[] { 0xC7, 0x49, 0x46, 0x41 });
    
    					// Write the default header information.
    					bw.Write((uint)0x14);	// size
    					bw.Write((uint)0x01);	// version
    					bw.Write((uint)0x00);	// reserved
    
    					// Write the file size.
    					bw.Write((uint)br.BaseStream.Length);
    
    					// Write the size of the file name.
    					bw.Write((uint)fileNameLength);
    
    					// Write the file name (Unicode encoded).
    					bw.Write(fileNameBytes);
    
    					// Write the file name terminator. This is two nulls in Unicode.
    					bw.Write(new byte[] {0,0});
    
    					// Iterate through the file reading data and writing it to the outbuffer.
    					byte[] data = new byte[64*1024];
    					int bytesRead = 1;
    
    					while (bytesRead > 0)
    					{
    						bytesRead = br.Read(data, 0, data.Length);
    						bw.Write(data, 0, bytesRead);
    					}
    				}
    			}
    
    
    			// This memorystream will hold the Base64 encoded InfoPath attachment.
    			MemoryStream msOut = new MemoryStream();
    
    			using (BinaryReader br = new BinaryReader(new MemoryStream(ms.ToArray())))
    			{
    				// Create a Base64 transform to do the encoding.
    				ToBase64Transform tf = new ToBase64Transform();
    
    				byte[] data = new byte[tf.InputBlockSize];
    				byte[] outData = new byte[tf.OutputBlockSize];
    
    				int bytesRead = 1;
    
    				while (bytesRead > 0)
    				{
    					bytesRead = br.Read(data, 0, data.Length);
    
    					if (bytesRead == data.Length)
    						tf.TransformBlock(data, 0, bytesRead, outData, 0);
    					else
    						outData = tf.TransformFinalBlock(data, 0, bytesRead);
    
    					msOut.Write(outData, 0, outData.Length);
    				}
    			}
    
    			msOut.Close();
    			
    			return base64EncodedFile = Encoding.ASCII.GetString(msOut.ToArray());
    		}
    	}
    }

Создание класса декодера в Visual Studio .NET 2003

  1. В обозревателе решений щелкните правой кнопкой мышиAttachmentEncodingи выберите последовательно пунктыДобавить, а затем нажмите кнопкуДобавление нового элемента.
  2. ВДобавление нового элементадиалоговое окно, нажмите кнопкуКлассвШаблонобласти, введитеInfoPathAttachmentDecoder.csвИмяв поле и нажмите кнопкуОткрыть.
  3. Замените весь код InfoPathAttachmentDecoder.cs файл со следующим кодом.
    using System;
    using System.IO;
    using System.Text;
    
    namespace InfoPathAttachmentEncoding
    {
    	/// <summary>
    	/// Decodes a file attachment and saves it to a specified path.
    	/// </summary>
    	public class InfoPathAttachmentDecoder
    	{
    		private const int SP1Header_Size = 20;
    		private const int FIXED_HEADER = 16;
    
    		private int fileSize;
    		private int attachmentNameLength;
    		private string attachmentName;
    		private byte[] decodedAttachment;
    
    		/// <summary>
    		/// Accepts the Base64 encoded string
    		/// that is the attachment.
    		/// </summary>
    		public InfoPathAttachmentDecoder(string theBase64EncodedString)
    		{
    			byte [] theData = Convert.FromBase64String(theBase64EncodedString);
    			using(MemoryStream ms = new MemoryStream(theData))
    			{
    				BinaryReader theReader = new BinaryReader(ms);			
    				DecodeAttachment(theReader);
    			}
    		}
    
    		private void DecodeAttachment(BinaryReader theReader)
    		{
    			//Position the reader to get the file size.
    			byte[] headerData = new byte[FIXED_HEADER];
    			headerData = theReader.ReadBytes(headerData.Length);
    
    			fileSize = (int)theReader.ReadUInt32();
    			attachmentNameLength = (int)theReader.ReadUInt32() * 2;
    			
    			byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength);
    			//InfoPath uses UTF8 encoding.
    			Encoding enc = Encoding.Unicode;
    			attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength - 2);
    			decodedAttachment = theReader.ReadBytes(fileSize);
    		}
    
    		public void SaveAttachment(string saveLocation)
    		{
    			string fullFileName = saveLocation;
    			if(!fullFileName.EndsWith(Path.DirectorySeparatorChar))
    			{
    				fullFileName += Path.DirectorySeparatorChar;
    			}
    
    			fullFileName += attachmentName;
    
    			if(File.Exists(fullFileName))
    				File.Delete(fullFileName);
    			
    			FileStream fs = new FileStream(fullFileName, FileMode.CreateNew);
    			BinaryWriter bw = new BinaryWriter(fs);
    			bw.Write(decodedAttachment);
    
    			bw.Close();
    			fs.Close();
    		}
    
    		public string Filename
    		{
    			get{ return attachmentName; }
    		}
    
    		public byte[] DecodedAttachment
    		{
    			get{ return decodedAttachment; }
    		}
    	}	
    }
    
    

Добавьте элемент управления «вложенный файл и элемент управления текстовое поле в форму InfoPath

  1. Шаблон формы в AttachmentEncoding InfoPath, нажмите кнопкуЭлементы управлениявЗадачи разработкиобласть задач.
  2. ВЭлементы управленияв InfoPath 2003 области задач, нажмите кнопкуФайл вложенияв группеВставка элементов управления.

    ВЭлементы управленияЗадание области в InfoPath 2007, нажмите кнопкуФайл вложенияв группеФайл и рисунок.
  3. Правой кнопкой мышиВложение файлауправлять, а затем нажмите кнопкуСвойства вложенного файла.
  4. ВСвойства вложенного файладиалоговое окно, типtheAttachmentFieldвПоле имяв поле и нажмите кнопкуОК.
  5. ВЭлементы управленияв InfoPath 2003 области задач, нажмите кнопкуТекстовое полев группеВставка элементов управления.

    ВЭлементы управленияЗадание области в InfoPath 2007, нажмите кнопкуТекстовое полев группеСтандартный.
  6. Правой кнопкой мышиТекстовое полеуправлять, а затем нажмите кнопкуСвойства текстового поля.
  7. ВСвойства текстового полядиалоговое окно, типtheAttachmentNameвПоле имяв поле и нажмите кнопкуОК.

Добавить на кнопку вложить в форму InfoPath

  1. ВЭлементы управленияв InfoPath 2003 области задач, нажмите кнопкуКнопкав группеВставка элементов управления.

    ВЭлементы управленияЗадание области в InfoPath 2007, нажмите кнопкуКнопкав группеСтандартный.
  2. Щелкните правой кнопкой мыши новыйКнопкауправлять, а затем нажмите кнопкуСвойства кнопки.
  3. ВСвойства кнопкидиалоговое окно, типПрисоединениевПодписьполе, типbtnAttachвИдентификаторв поле и нажмите кнопкуРедактировать код формы.
  4. Добавьте следующий код вbtnAttach_OnClickметод.
    //Get a reference to the attachment node.
    IXMLDOMNode theAttachmentNode = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentField");
    
    //Get a reference to the filename node.
    IXMLDOMNode fileNameNode = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentName");
    //Get the text of the node.
    String fileName = fileNameNode.text;
    if(fileName.Length > 0)
    {
    	//Encode the file and assign it to the attachment node.
    	InfoPathAttachmentEncoding.Encoder myEncoder = new InfoPathAttachmentEncoding.Encoder(fileName);
    	if(theAttachmentNode.attributes.getNamedItem("xsi:nil") != null)
    		theAttachmentNode.attributes.removeNamedItem("xsi:nil");
    	theAttachmentNode.text = myEncoder.ToBase64String();
    }	
    

Установка, кнопка сохранения в форму InfoPath

  1. Переключитесь в шаблон формы AttachmentEncoding InfoPath.
  2. ВЭлементы управленияв InfoPath 2003 области задач, нажмите кнопкуКнопкав группеВставка элементов управления.

    ВЭлементы управленияЗадание области в InfoPath 2007, нажмите кнопкуКнопкав группеСтандартный.
  3. Щелкните правой кнопкой мыши новыйКнопкауправлять, а затем нажмите кнопкуСвойства кнопки.
  4. ВСвойства кнопкидиалоговое окно, типСохранитьвПодписьполе, типbtnSaveвИдентификаторв поле и нажмите кнопкуРедактировать код формы.
  5. Добавьте следующий код в_OnClick btnSaveметод.
    //Get a reference to the attachment node.
    IXMLDOMNode n = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentField");
    //Get the text of the node.
    String theAttachment = n.text;
    if(theAttachment.Length > 0)
    {
    	InfoPathAttachmentEncoding.Decoder myDecoder = new InfoPathAttachmentEncoding.Decoder(theAttachment);
    	myDecoder.SaveAttachment(@"<Path to save the file>");
    }			
    
    ПримечаниеВ этом коде необходимо заменить< Путь для сохранения файла >с тем местом, где требуется сохранить файл.

Убедитесь, что полностью доверенный шаблон формы InfoPath

, Прежде чем можно будет проверить эту форму, шаблон формы InfoPath должны иметь полное доверие. Можно использовать одно из следующих действий убедитесь, что полностью доверенный шаблон формы InfoPath:
  • Используйте служебную программу настройки Microsoft .NET Framework 1.1 предоставить полное доверие разрешения только на C# кода.
  • Служебная программа the RegForm использования программного обеспечения InfoPath пакета средств разработки (SDK) для создания формы полностью доверенные формы. Это предоставляет разрешения полного доверия к коду Visual C#.
  • Сертификат подписи кода используется для создания цифровой подписи файла шаблона формы (.xsn). При использовании сертификата подписи кода для создания цифровой подписи файла шаблона формы, пользователи получают запрос доверительные отношения в форме при открытии формы. Это позволяет полностью доверенной формы. Таким образом Visual C#, коду предоставляются разрешения полного доверия.
  • ИспользованиеIPFullTrustмакрос в InfoPath SDK, чтобы сделать форму полностью доверенной формы. IPFullTrustмакрос позволяет автоматизировать задание файла манифеста (.xsf) и файл шаблона формы в проекте InfoPath для полного доверия, а затемIPFullTrustмакрос автоматически регистрирует шаблона формы.

    Для получения дополнительных сведений о том, как установить и использовать макрос, посетите следующий веб-узел Microsoft Developer Network (MSDN):
    .aspx HTTP://msdn2.Microsoft.com/en-us/library/aa202736 (office.11)
  • Использовать внешние автоматизации в InfoPath для вызоваRegisterSolutionметод . Как правило этот метод используется только для разработки форм, так как зарегистрированных формы регистрирует только для отдельного компьютера. Для любых дополнительных форм другим пользователям, необходимо зарегистрировать дополнительные формы на своих компьютерах. Не рекомендуется использовать этот метод для дополнительных форм. Корпорация Майкрософт рекомендует одним из предыдущих способов, при публикации формы.
Так как эта форма находится в разработке формы, можно использовать последний метод. Для этого найдите шаблон формы AttachmentEncoding InfoPath и затем выполните следующие действия:
  1. НаСредстваменю, нажмите кнопкуФормы параметры.
  2. Нажмите кнопкуБезопасностьвкладку.
  3. СнимитеАвтоматически определять уровень безопасности, в зависимости от макета формы (рекомендуется)флажок в поле.

    ПримечаниеInfoPath не удается автоматически определить бизнес-логику, требуются разрешения полного доверия. Таким образом, необходимо явно предоставить разрешения полного доверия.
  4. Нажмите кнопкуПолное доверие., а затем нажмите кнопкуОК.
  5. Закрыть шаблон формы AttachmentEncoding InfoPath. Если будет предложено сохранить изменения, нажмите кнопкуДа.

    ПримечаниеНе закрывайте проект Visual Studio .NET 2003.
  6. В Visual Studio .NET 2003, дважды щелкнитеManifest.xsfфайл в обозревателе решений. Открывает файл Manifest.xsf.
  7. В корневом узле найдитеpublishUrlатрибут . УдалитьpublishUrlатрибут и значениеpublishUrlатрибут.
  8. Сохранить изменения и закройте Manifest.xsf.
  9. Нажмите кнопкуЗапуститьщелкнитеЗапуститьВведитепрограмма «Блокнот», а затем нажмите кнопкуОК.
  10. Добавить следующий код в пустой текстовый файл.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    ПримечаниеВ этом коде необходимо заменить<project_folder_url>по пути файл Manifest.xsf, в папке проекта. Не забудьте escape-путь к файлу Manifest.xsf. Необходимо заменить все одной черты (\) в пути с двух обратных косых черт (\).
  11. The Manifest.xsf, сохраните файл на компьютере, что файл Register.js.
  12. ВызоваRegisterSolutionметод, дважды щелкните значокRegister.jsфайл, созданный.

Проверка формы

  1. Проект в AttachmentEncoding Visual Studio .NET 2003, нажмите кнопкуЗапуститьнаОтладкаменю. Форма InfoPath будет запущен в режиме предварительного просмотра.
  2. Формы в InfoPath, введите путь к файлу, который требуется вложить в текстовом поле и нажмите кнопкуПрисоединение.

    ПримечаниеДважды щелкните значокВложение файлауправления проверить файл закодирован правильно.
  3. Нажмите кнопкуСохранить. Найти путь, указанный в "Add aСохранитькнопку, чтобы форма InfoPath "раздел.
  4. Для завершения проверки нажмите кнопкуЗакрыть предварительный просмотр.

Ссылки

Для получения дополнительных сведений о формате заголовка файла вложения, посетите веб-узел MSDN веб-узла:
Вложение файлов в InfoPath 2003
.aspx HTTP://msdn2.Microsoft.com/en-us/library/aa168351 (office.11)

Свойства

Код статьи: 892730 - Последний отзыв: 22 сентября 2011 г. - Revision: 3.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Office InfoPath 2007
Ключевые слова: 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:892730

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com