Você está offline; aguardando reconexão

Como codificar e decodificar um anexo de arquivo por meio de programação usando Visual C# no InfoPath 2003

O suporte para o Office 2003 terminou

A Microsoft terminou o suporte para o Office 2003 em 8 de abril de 2014. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 892730
Sumário
No Microsoft Office InfoPath 2007 ou no Microsoft Office InfoPath 2003 Service Pack 1 (SP1), você pode usar um controle de Anexo de arquivo para anexar um arquivo ao modelo de formulário do InfoPath. Em determinadas circunstâncias, convém codificar e decodificar, em seguida, o arquivo é anexado ao controle de Anexo de arquivo . Nesse caso, você pode usar Microsoft Visual C# para criar uma Codificador classe e um Decodificador classe. Em seguida, você pode usar o Codificador classe e o Decodificador classe para codificar e decodificar o anexo de arquivo.
INTRODUÇÃO
Este artigo discute como codificar e decodificar um anexo de arquivo por meio de programação usando o Microsoft Visual C# no InfoPath 2003. Para obter informações sobre como fazer isso no InfoPath 2010 ou no InfoPath 2007, consulte a seguinte página web: Como codificar e decodificar um anexo de arquivo por meio de programação usando Visual C# no InfoPath 2010 ou no InfoPath 2007.
Mais Informações
A Microsoft fornece exemplos de programação somente para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação a um propósito específico. Este artigo presume que você esteja familiarizado com a linguagem de programação que está sendo demonstrada e com as ferramentas usadas para criar e depurar procedimentos. Engenheiros de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas eles não modificarão esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades específicas.

Criar um projeto Visual C# do InfoPath 2003

  1. Inicie o Microsoft Visual Studio .NET 2003.
  2. No menu arquivo , clique emnovoe, em seguida, clique em Project.
  3. Na caixa de diálogo New Project , clique emProjetos do Visual C# na Projectsfolder do Microsoft Office InfoPath.
  4. Na caixa nome , digiteAttachmentEncodinge, em seguida, clique emOK.
  5. No Assistente de projeto do Microsoft Office, clique emcriar um novo modelo de formulárioe, em seguida, clique emConcluir.

    Assistente do Microsoft Office Project cria novo projeto do Visual Studio .NET 2003 chamado AttachmentEncoding. Modelo de formulário do AnInfoPath também é criado. AttachmentEncoding InfoPath isnamed ao modelo de formulário.

Criar uma classe de codificador no Visual Studio .NET 2003

  1. No Solution Explorer, clique com o botãoAttachmentEncoding, aponte para Adde thenclick Add New Item.
  2. Na caixa de diálogo Add New Item , clique emClass no painel de modelo , tipoInfoPathAttachmentEncoder.cs onome da caixa e, em seguida, clique em Abrir.
  3. Substitua todo o código do InfoPathAttachmentEncoder.csfile com o código a seguir.
    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());		}	}}

Criar uma classe de decodificador no Visual Studio .NET 2003

  1. No Solution Explorer, clique com o botãoAttachmentEncoding, aponte para Adde thenclick Add New Item.
  2. Na caixa de diálogo Add New Item , clique emClass no painel de modelo , tipoInfoPathAttachmentDecoder.cs onome da caixa e, em seguida, clique em Abrir.
  3. Substitua todo o código do InfoPathAttachmentDecoder.csfile com o código a seguir.
    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; }		}	}	}

Adicione um controle de anexo de arquivo e um controle de caixa de texto ao formulário do InfoPath

  1. No modelo de formulário do AttachmentEncoding InfoPath, clique em controles no painel de tarefas Tarefas de Design .
  2. No painel de tarefas controles, clique emFileAttachment emInserir controles.
  3. Clique com botão direito no controle de Anexo de arquivo e, em seguida, clique em File Attachment Properties.
  4. Na dialogbox File Attachment Properties , digite theAttachmentField no FieldName caixa e, em seguida, clique em OK.
  5. No painel de tarefas controles, clique emCaixa de texto emInserir controles.
  6. Clique com botão direito no controle Caixa de texto e thenclick Propriedades de caixa de texto.
  7. Na caixa de diálogo Propriedades de caixa de texto , digite theAttachmentName no FieldName caixa e, em seguida, clique em OK.

Adicionar um botão Anexar ao formulário do InfoPath

  1. No painel de tarefas controles, clique embotão emInserir controles.
  2. Clique com botão direito no novo controle Button , e clique em Propriedades do botão.
  3. Na caixa de diálogo Propriedades do botão , digiteAnexar Na caixa rótulo , digitebtnAttach a identificação do caixa e, em seguida, clique emEditar código do formulário.
  4. Adicione o seguinte código para o btnAttach_OnClick método.
    //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();}	

Adicionar um botão Salvar ao formulário do InfoPath

  1. Alterne para o formtemplate AttachmentEncoding InfoPath.
  2. No painel de tarefas controles, clique embotão emInserir controles.
  3. Clique com botão direito no novo controle Button , e clique em Propriedades do botão.
  4. Na caixa de diálogo Propriedades do botão , digiteSalvar Na caixa rótulo , digitebtnSave a identificação do caixa e, em seguida, clique emEditar código do formulário.
  5. Adicione o seguinte código para o btnSave _OnClick método.
    //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>");}			
    Observação: Nesse código, substitua <Path to="" save="" thefile=""></Path> com o local onde você deseja salvar Oarquivo.

Certifique-se de que o modelo de formulário do InfoPath é totalmente confiável

Antes de testar este formulário, o modelo de formulário do InfoPath deve ser totalmente confiável. Você pode usar um dos métodos a seguir para certificar-se de que o modelo de formulário do InfoPath é totalmente confiável:
  • Use o utilityto de configuração do Microsoft.NET Framework 1.1 conceder permissões de confiança total somente para o seu código do Visual C#.
  • Use o utilitário RegForm do InfoPath SoftwareDevelopment Kit (SDK) para tornar o formulário um formulário totalmente confiável. Isso concede permissões FullTrust para seu código Visual C#.
  • Use um certificado de assinatura de código para assinar digitalmente o arquivo formtemplate (. xsn). Quando você usar um certificado de assinatura de código digital signthe arquivo de modelo de formulário, os usuários são solicitados a confiar no formulário quando abrirem o formulário. Isso torna o formulário totalmente confiável. Portanto, confiança total permissões aregranted para seu código Visual C#.
  • Use o IPFullTrust macro do SDK do InfoPath para tornar o formulário trustedform totalmente. O IPFullTrust macro automatiza a configuração do arquivo de manifesto (. xsf) e o arquivo formtemplate no projeto do InfoPath para confiança total e, em seguida, o IPFullTrust macro registra automaticamente o modelo de formulário.

    Formore informações sobre como instalar e usar a macro, visite o site do followingMicrosoft Developer Network (MSDN):
  • Usar a automação no InfoPath para chamar a RegisterSolution método. Normalmente, este método só é usado para developmentbecause do formulário que só registra um formulário registrado para um computador individual. Para formulários de anyadditional, outros usuários devem registrar as formas adicionais em seus owncomputers. Não recomendamos esse método para formulários adicionais. Nós recommendany um dos métodos anteriores quando você publicar o formulário.
Como este formulário está em desenvolvimento do formulário, você pode usar o último método. Para fazer isso, localize o modelo de formulário do AttachmentEncoding InfoPath e, em seguida, execute as seguintes etapas:
  1. No menu Ferramentas , clique em FormOptions.
  2. Clique na guia segurança .
  3. Clique para desmarcar a caixa de seleção automaticamente determinar securitylevel com base no design do formulário (recomendado) .

    Observação: O InfoPath não pode detectar automaticamente lógica de negócios thatrequires permissões de confiança total. Portanto, você deve explicitamente conceder permissões FullTrust.
  4. Clique em Confiança totale, em seguida, clique emOK.
  5. Feche o modelo de formulário do AttachmentEncoding InfoPath. Se você for solicitado a salvar as alterações, clique em Sim.

    Observação: Não feche o projeto do Visual Studio .NET 2003.
  6. No Visual Studio .NET 2003, clique duas vezes no arquivo manifestxsf no Solution Explorer. Fileopens manifest. xsf.
  7. No nó raiz, localize a publishUrl atributo. Remover a publishUrl atributo e o valor da publishUrl atributo.
  8. Salve as alterações e feche o Manifest.xsffile.
  9. Clique em Iniciar, Executar, tipo bloco de notase, em seguida, clique emOK.
  10. Adicione o seguinte código para o arquivo de texto em branco.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");strAbsolutePath = "<project_folder_url>\\Manifest.xsf";oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    Observação: Nesse código, substitua<project_folder_url></project_folder_url> com o caminho do arquivo theManifest.xsf na pasta do projeto. Lembre-se do caminho do arquivo de theManifest.xsf de escape. Todos os única barras invertidas (\) no caminho devem ser substituído withtwo barras invertidas (\).
  11. Salve o arquivo manifest xsf no computador como arquivo de theRegister.js.
  12. Para chamar a RegisterSolution método, clique duas vezes em autilização criada a Register.js do arquivo.

Testar o formulário

  1. No projeto AttachmentEncoding Visual Studio .NET 2003, clique em Iniciar no menu Debug . Este formulário do InfoPath no modo de visualização de startsthe.
  2. No formulário do InfoPath, digite o caminho da autilização de arquivo deseja anexar na caixa de texto e, em seguida, clique emAnexar.

    Observação: Clique duas vezes no controle Anexo de arquivo para verificar que o arquivo está codificado corretamente.
  3. Clique em Salvar. Localize o caminho que youprovided na seção "Adicionar um botão Salvar ao formulário do InfoPath".
  4. Para finalizar o teste, clique em ClosePreview.
Referências
Para obter mais informações sobre o formato de cabeçalho de anexo de arquivo, visite o seguinte site da MSDN:
IP2003

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 892730 - Última Revisão: 06/21/2015 03:51:00 - Revisão: 1.0

Microsoft Office InfoPath 2003

  • kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtpt
Comentários