Cómo codificar y descodificar un archivo adjunto mediante programación utilizando Visual C# en InfoPath 2003

Seleccione idioma Seleccione idioma
Id. de artículo: 892730 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En InfoPath 2007 de Microsoft Office o Microsoft Office InfoPath 2003 Service Pack 1 (SP1), puede utilizar un Archivo adjunto control para adjuntar un archivo a la plantilla de formulario de InfoPath. En determinadas circunstancias, quizás codificar y descodificar, a continuación, el archivo que está asociado a la Archivo adjunto control. En este caso, puede utilizar Microsoft Visual C# para crear un Codificador clase y un Descodificador clase. A continuación, puede utilizar el Codificador clase y el Descodificador clase para codificar y descodificar el archivo datos adjuntos.

INTRODUCCIÓN

En este artículo se presenta cómo codificar y descodificar un archivo adjunto mediante programación con Microsoft Visual C# de InfoPath 2003. Para obtener información acerca de cómo hacerlo en 2010 de InfoPath o en InfoPath 2007, consulte la siguiente página web: Cómo codificar y descodificar un archivo adjunto mediante programación utilizando Visual C# en 2010 de InfoPath o en InfoPath 2007.

Más información

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita. Esto incluye, pero no está limitado a las garantías implícitas de comerciabilidad o idoneidad para un determinado propósito. En este artículo se supone que está familiarizado con la programación idioma que se muestra y con las herramientas que se utilizan para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden ayudar a explicar el funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para proporcionan una mayor funcionalidad ni crearán procedimientos adaptados a su requisitos específicos.

Crear un proyecto de Visual C# InfoPath 2003

  1. Iniciar Visual Studio de Microsoft.NET 2003.
  2. En el Archivo menú, haga clic enNuevoy, a continuación, haga clic en Proyecto.
  3. En el Nuevo proyecto cuadro de diálogo, haga clic enProyectos de Visual C# en los proyectos de InfoPath Microsoft Office carpeta.
  4. En el Nombre cuadro, escribaAttachmentEncodingy, a continuación, haga clic enACEPTAR.
  5. En el Asistente para proyectos de Microsoft Office, haga clic enCrear una nueva plantilla de formularioy, a continuación, haga clic enFinalizar.

    El Asistente para proyectos de Microsoft Office crea un nueva Visual Studio.NET 2003 proyecto denominado AttachmentEncoding. Un También se crea la plantilla de formulario de InfoPath. Es la plantilla de formulario de InfoPath el nombre AttachmentEncoding.

Crear una clase de codificador en Visual Studio.NET 2003

  1. En el Explorador de soluciones, haga clic enAttachmentEncoding, seleccione Agregary, a continuación Haga clic en Agregar nuevo elemento.
  2. En el Agregar nuevo elemento cuadro de diálogo, haga clic enClase en el Plantilla panel, tipoInfoPathAttachmentEncoder.cs en elNombre cuadro y, a continuación, haga clic en Abierto.
  3. Reemplazar todo el código de la InfoPathAttachmentEncoder.cs archivo con el código siguiente.
    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());
    		}
    	}
    }

Crear una clase de descodificador de Visual Studio.NET 2003

  1. En el Explorador de soluciones, haga clic enAttachmentEncoding, seleccione Agregary, a continuación Haga clic en Agregar nuevo elemento.
  2. En el Agregar nuevo elemento cuadro de diálogo, haga clic enClase en el Plantilla panel, tipoInfoPathAttachmentDecoder.cs en elNombre cuadro y, a continuación, haga clic en Abierto.
  3. Reemplazar todo el código de la InfoPathAttachmentDecoder.cs archivo con el código siguiente.
    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; }
    		}
    	}	
    }
    
    

Agregar un control de datos adjuntos de archivo y un control de cuadro de texto para el formulario de InfoPath

  1. En la plantilla de formulario de AttachmentEncoding InfoPath Haga clic en Controles en el Tareas de diseño tarea panel.
  2. En el Controlespanel de tareas, haga clic enArchivo Datos adjuntos bajoInsertar controles.
  3. (Ratón) en el Archivo adjunto control, y, a continuación, haga clic en Propiedades de archivo adjunto.
  4. En el Propiedades de archivo adjunto cuadro de diálogo cuadro, escriba theAttachmentField en el Campo Nombre cuadro y, a continuación, haga clic en ACEPTAR.
  5. En el Controlespanel de tareas, haga clic enCuadro de texto bajoInsertar controles.
  6. (Ratón) en el Cuadro de texto control y, a continuación Haga clic en Propiedades de cuadro de texto.
  7. En el Propiedades de cuadro de texto cuadro de diálogo, tipo theAttachmentName en el Campo Nombre cuadro y, a continuación, haga clic en ACEPTAR.

Agregar un botón adjuntar al formulario de InfoPath

  1. En el Controlespanel de tareas, haga clic enBotón bajoInsertar controles.
  2. Haga clic en el nuevo Botón control, y a continuación, haga clic en Propiedades del botón.
  3. En el Propiedades del botón cuadro de diálogo, escribaAdjuntar en el Etiqueta cuadro, escribabtnAttach en el ID. cuadro y, a continuación, haga clic enEditar código del formulario.
  4. Agregue el código siguiente en el 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();
    }	
    

Agregar un botón de guardar el formulario de InfoPath

  1. Cambiar el formulario de AttachmentEncoding InfoPath plantilla.
  2. En el Controlespanel de tareas, haga clic enBotón bajoInsertar controles.
  3. Haga clic en el nuevo Botón control, y a continuación, haga clic en Propiedades del botón.
  4. En el Propiedades del botón cuadro de diálogo, escribaGuardar en el Etiqueta cuadro, escribabtnSave en el ID. cuadro y, a continuación, haga clic enEditar código del formulario.
  5. Agregue el código siguiente en el 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>");
    }			
    
    Nota En este código, reemplace <Path to="" save="" the="" file=""></Path> con la ubicación donde desea guardar el archivo.

Asegúrese de que la plantilla de formulario de InfoPath es de plena confianza

Antes de probar esta forma, la plantilla de formulario de InfoPath debe ser de plena confianza. Puede utilizar uno de los métodos siguientes para asegurarse de que que la plantilla de formulario de InfoPath es totalmente de confianza:
  • Utilizar Microsoft.Utilidad de configuración de NET Framework 1.1 Para conceder permisos de plena confianza sólo para el código de Visual C#.
  • Utilice la utilidad de RegForm desde el InfoPath Software Kit de desarrollo (SDK) para que el formulario en un formulario de plena confianza. Esto concede completo Confiar en los permisos para el código de Visual C#.
  • Utilizar un certificado de firma de código para firmar digitalmente el formulario archivo de plantilla (.xsn). Cuando utilice un certificado de firma de código para firmar digitalmente el archivo de plantilla de formulario, se solicitará a los usuarios a confiar en el formulario cuando abran el formulario. Esto hace que el formulario de plena confianza. Por lo tanto, son permisos de plena confianza conceder a su código de Visual C#.
  • Utilice el IPFullTrust macro desde el SDK de InfoPath para que el formulario de plena confianza formulario. El IPFullTrust macro automatiza la configuración del archivo de manifiesto (.xsf) y el formulario archivo de plantilla en el proyecto de InfoPath de plena confianza y, a continuación, el IPFullTrust macro registra automáticamente la plantilla de formulario.

    Para obtener más información acerca de cómo instalar y utilizar la macro, visite el siguiente Sitio Web de Microsoft Developer Network (MSDN):
    http://msdn2.Microsoft.com/en-us/library/aa202736 (office.11) .aspx
  • Utilizar la automatización externa en InfoPath para llamar a la RegisterSolution método. Normalmente, este método sólo se utiliza para el desarrollo de formularios debido a que sólo registra un formulario registrado para un equipo individual. Para cualquiera formas adicionales, otros usuarios deben registrar los demás formularios en sus propios equipos. No se recomienda este método para los formularios adicionales. Se recomienda uno de los métodos anteriores al publicar el formulario.
Debido a que este formulario está en desarrollo de formulario, puede utilizar el último método. Para ello, busque el formulario de AttachmentEncoding InfoPath plantilla y, a continuación, siga estos pasos:
  1. En el Herramientas menú, haga clic en Formulario Opciones de.
  2. Haga clic en el Seguridad ficha.
  3. Haga clic para desactivar la Determinar automáticamente la seguridad nivel según el diseño del formulario (recomendado) casilla de verificación.

    Nota InfoPath no puede detectar automáticamente la lógica empresarial que requiere permisos de plena confianza. Por lo tanto, debe conceder explícitamente completo Los permisos de confianza.
  4. Haga clic en Plena confianzay, a continuación, haga clic enACEPTAR.
  5. Cierre la plantilla de formulario de AttachmentEncoding InfoPath. Si se le pregunta si desea guardar los cambios, haga clic en .

    Nota No cierre el Visual Studio.NET 2003 proyecto.
  6. En Visual Studio.NET 2003, haga doble clic en elManifest.xsf archivo en el Explorador de soluciones. El archivo Manifest.xsf se abre.
  7. En el nodo raíz, busque el publishUrl atributo. Quitar el publishUrl atributo y el valor de la publishUrl atributo.
  8. Guardar los cambios y, a continuación, cierre el archivo Manifest.xsf archivo.
  9. Haga clic en Inicio, haga clic en Ejecutar, tipo Bloc de notasy, a continuación, haga clic enACEPTAR.
  10. Agregue el código siguiente al archivo de texto en blanco.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    Nota En este código, reemplace<project_folder_url></project_folder_url> con la ruta de acceso de la Archivo manifest.xsf de la carpeta del proyecto. Recuerde que escapar de la ruta de acceso de la Archivo manifest.xsf. Todas las barras invertidas única (\) en la ruta de acceso deben sustituirse por dos barras diagonales inversas (\).
  11. Guarde el archivo Manifest.xsf, en el equipo como el Archivo Register.js.
  12. Para llamar a la RegisterSolution método, haga doble clic en el Register.js archivo que ha creado.

Probar el formulario

  1. En el Visual Studio de AttachmentEncoding.NET 2003 proyecto, Haga clic en Inicio En la página Depurar menú. Se iniciará el formulario de InfoPath en modo de vista previa.
  2. En el formulario de InfoPath, escriba la ruta de acceso del archivo que que desea adjuntar en el cuadro de texto y, a continuación, haga clic enAdjuntar.

    Nota Haga doble clic en el Archivo adjunto el control a Compruebe que el archivo está codificado correctamente.
  3. Haga clic en Guardar. Busque la ruta de acceso que usted en el "Agregar un Guardar botón al formulario de InfoPath" sección.
  4. Para finalizar la prueba, haga clic en Cerrar Vista previa.

Referencias

Para obtener más información sobre el encabezado del archivo adjunto dar formato, visite el siguiente sitio Web de MSDN:
Adjuntar archivos en InfoPath 2003
http://msdn2.Microsoft.com/en-us/library/aa168351 (office.11) .aspx

Propiedades

Id. de artículo: 892730 - Última revisión: lunes, 5 de marzo de 2012 - Versión: 0.1
La información de este artículo se refiere a:
  • Microsoft Office InfoPath 2003
Palabras clave: 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 892730

Enviar comentarios

 

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