Comment faire pour coder et décoder un fichier en pièce jointe par programmation à l'aide de Visual C# dans InfoPath 2003

Traductions disponibles Traductions disponibles
Numéro d'article: 892730 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Dans InfoPath 2007 de Microsoft Office ou Microsoft Office InfoPath 2003 Service Pack 1 (SP1), vous pouvez utiliser un Pièce jointe contrôle pour joindre un fichier au modèle de formulaire InfoPath. Dans des circonstances particulières, vous souhaiterez peut-être coder et décoder ensuite le fichier qui est attaché à la Pièce jointe contrôle. Dans ce cas, vous pouvez utiliser Microsoft Visual C# pour créer un Codeur classe et un Décodeur classe. Ensuite, vous pouvez utiliser le Codeur classe et le Décodeur classe pour coder et décoder le fichier pièce jointe.

INTRODUCTION

Cet article présente comment coder et décoder un fichier en pièce jointe par programmation à l'aide de Microsoft Visual C# dans InfoPath 2003. Pour plus d'informations sur comment procéder dans InfoPath 2010 ou dans InfoPath 2007, consultez la page web suivante : Comment faire pour coder et décoder un fichier en pièce jointe par programmation à l'aide de Visual C# dans InfoPath 2010 ou InfoPath 2007.

Plus d'informations

Microsoft fournit des exemples de programmation fins d'illustration uniquement, sans garantie expresse ou implicite. Ceci inclut, mais n'est pas limité pour les garanties implicites de qualité marchande ou d'adéquation à un usage objectif. Cet article suppose que vous êtes familiarisé avec la programmation langue qui est présenté et les outils qui servent à créer et pour déboguer des procédures. Ingénieurs du support technique Microsoft peuvent vous expliquer la la fonctionnalité d'une procédure particulière, mais ils ne peuvent pas modifier ces exemples pour fournir des fonctionnalités supplémentaires ou créer des procédures pour répondre à vos exigences spécifiques.

Créez un projet InfoPath 2003 Visual C#

  1. Démarrez Microsoft Visual Studio.NET 2003.
  2. Sur la Fichier menu, cliquez surNouveau, puis cliquez sur Projet.
  3. Dans le Nouveau projet boîte de dialogue, cliquez surProjets Visual C# dans les projets InfoPath Microsoft Office dossier.
  4. Dans le Nom zone, tapezAttachmentEncoding, puis cliquez surOK.
  5. Dans l'Assistant de projet Microsoft Office, cliquez surCréer un nouveau modèle de formulaire, puis cliquez surTerminer.

    L'Assistant de projet Microsoft Office crée un nouvelle Visual Studio.NET 2003 projet nommé AttachmentEncoding. Un Modèle de formulaire InfoPath est également créé. Le modèle de formulaire InfoPath est nommé AttachmentEncoding.

Créer une classe de codeur dans Visual Studio.NET 2003

  1. Dans l'Explorateur de solutions, cliquez avec le droitAttachmentEncoding, pointez sur Ajouter, puis Cliquez sur Ajouter un nouvel élément.
  2. Dans le Ajouter un nouvel élément boîte de dialogue, cliquez surClasse dans le Modèle volet, typeInfoPathAttachmentEncoder.cs dans leNom zone, puis cliquez sur Ouvrir.
  3. Remplacez tout le code dans le InfoPathAttachmentEncoder.cs fichier avec le code suivant.
    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());
    		}
    	}
    }

Créez une classe de décodeur dans Visual Studio.NET 2003

  1. Dans l'Explorateur de solutions, cliquez avec le droitAttachmentEncoding, pointez sur Ajouter, puis Cliquez sur Ajouter un nouvel élément.
  2. Dans le Ajouter un nouvel élément boîte de dialogue, cliquez surClasse dans le Modèle volet, typeInfoPathAttachmentDecoder.cs dans leNom zone, puis cliquez sur Ouvrir.
  3. Remplacez tout le code dans le InfoPathAttachmentDecoder.cs fichier avec le code suivant.
    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; }
    		}
    	}	
    }
    
    

Ajoutez un contrôle de pièce jointe et un contrôle zone de texte au formulaire InfoPath

  1. Dans le modèle de formulaire AttachmentEncoding InfoPath Cliquez sur Contrôles dans le Tâches de conception tâche volet.
  2. Dans le Contrôlesvolet Office, cliquez surFichier Pièce jointe sousInsérer des contrôles.
  3. Cliquez droit sur le Pièce jointe contrôle, puis cliquez sur Propriétés des pièces jointes de fichier.
  4. Dans le Propriétés des pièces jointes de fichier boîte de dialogue zone, tapez theAttachmentField dans le Champ Nom zone, puis cliquez sur OK.
  5. Dans le Contrôlesvolet Office, cliquez surZone de texte sousInsérer des contrôles.
  6. Cliquez droit sur le Zone de texte contrôle, puis Cliquez sur Propriétés-zone de texte.
  7. Dans le Propriétés-zone de texte boîte de dialogue, type theAttachmentName dans le Champ Nom zone, puis cliquez sur OK.

Ajoutez un bouton Joindre au formulaire InfoPath

  1. Dans le Contrôlesvolet Office, cliquez surBouton sousInsérer des contrôles.
  2. Cliquez droit sur le nouveau Bouton contrôle, et puis cliquez sur Propriétés du bouton.
  3. Dans le Propriétés du bouton boîte de dialogue, tapezJoindre dans le Étiquette zone, tapezbtnAttach dans le ID zone, puis cliquez surModifier le Code du formulaire.
  4. Ajoutez le code suivant dans la btnAttach_OnClick méthode.
    //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();
    }	
    

Ajouter un bouton Enregistrer dans le formulaire InfoPath

  1. Basculez vers le formulaire AttachmentEncoding InfoPath modèle.
  2. Dans le Contrôlesvolet Office, cliquez surBouton sousInsérer des contrôles.
  3. Cliquez droit sur le nouveau Bouton contrôle, et puis cliquez sur Propriétés du bouton.
  4. Dans le Propriétés du bouton boîte de dialogue, tapezEnregistrer dans le Étiquette zone, tapezbtnSave dans le ID zone, puis cliquez surModifier le Code du formulaire.
  5. Ajoutez le code suivant dans la btnSave _OnClick méthode.
    //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>");
    }			
    
    Remarque Dans ce code, remplacez <Path to="" save="" the="" file=""></Path> avec l'emplacement où vous souhaitez enregistrer le fichier.

Assurez-vous que le modèle de formulaire InfoPath est entièrement fiable

Avant, vous pouvez tester ce formulaire, le modèle de formulaire InfoPath doit être entièrement fiable. Vous pouvez utiliser l'une des méthodes suivantes pour vous assurer que le modèle de formulaire InfoPath est entièrement fiable :
  • Utilisez le Microsoft.Utilitaire de Configuration de NET Framework 1.1 Pour accorder des autorisations confiance totale uniquement à votre code Visual C#.
  • Utilisez l'utilitaire RegForm à partir du logiciel InfoPath Kit de développement (SDK) pour rendre le formulaire un formulaire entièrement fiable. Cette action accorde intégral Approbation des autorisations à votre code Visual C#.
  • Utiliser un certificat de signature de code pour signer numériquement le formulaire fichier modèle (.xsn). Lorsque vous utilisez un certificat de signature de code pour signer numériquement le fichier de modèle de formulaire, les utilisateurs sont invités à approuver le formulaire lorsqu'ils ouvrent le formulaire. Cela rend le formulaire entièrement fiable. Par conséquent, sont des autorisations confiance totale accordées à votre code Visual C#.
  • Utiliser le IPFullTrust macro du SDK d'InfoPath pour rendre le formulaire entièrement fiable formulaire. Le IPFullTrust macro automatise la configuration du fichier manifest (.xsf) et le formulaire fichier de modèle dans le projet InfoPath pour une confiance totale, puis le IPFullTrust macro enregistre automatiquement le modèle de formulaire.

    Pour plus d'informations sur comment installer et utiliser la macro, visitez le Site Web de Microsoft Developer Network (MSDN) :
    http://msdn2.Microsoft.com/en-us/library/aa202736 (office.11) .aspx
  • Utiliser l'automatisation externe dans InfoPath pour appeler le RegisterSolution méthode. En règle générale, cette méthode est utilisée uniquement pour le développement de formulaires dans la mesure où un formulaire enregistré s'inscrit uniquement pour un ordinateur individuel. Pour tout formulaires supplémentaires, les autres utilisateurs doivent inscrire les autres formulaires sur leur propre ordinateurs. Nous ne recommandons pas cette méthode pour des formulaires supplémentaires. Nous vous recommandons de l'une des méthodes précédentes lorsque vous publiez le formulaire.
Étant donné que ce formulaire est en cours de développement de formulaire, vous pouvez utiliser le dernière méthode. Pour ce faire, recherchez le formulaire AttachmentEncoding InfoPath modèle, puis procédez comme suit :
  1. Sur la Outils menu, cliquez sur Formulaire Options.
  2. Cliquez sur le Sécurité onglet.
  3. Cliquez pour effacer la Déterminer automatiquement la sécurité niveau selon la conception du formulaire (recommandée) case à cocher.

    Remarque InfoPath ne peut pas détecter automatiquement la logique métier qui requiert des autorisations confiance totale. Par conséquent, vous devez accorder explicitement intégral Autorisations d'approbation.
  4. Cliquez sur Confiance totale, puis cliquez surOK.
  5. Fermez le modèle de formulaire AttachmentEncoding InfoPath. Si vous êtes invité à enregistrer les modifications, cliquez sur Oui.

    Remarque Ne fermez pas le Visual Studio.NET 2003 projet.
  6. Dans Visual Studio.NET 2003, double-cliquez sur leManifest.xsf fichier dans l'Explorateur de solutions. Le fichier Manifest.xsf s'ouvre.
  7. Dans le n?ud racine, repérez le publishUrl attribut. Supprimer le publishUrl attribut et la valeur de la publishUrl attribut.
  8. Enregistrez vos modifications et fermez le Manifest.xsf fichier.
  9. Cliquez sur Démarrer, cliquez sur Exécuter, type bloc-notes, puis cliquez surOK.
  10. Ajoutez le code suivant dans le fichier texte vide.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    Remarque Dans ce code, remplacez<project_folder_url></project_folder_url> avec le chemin d'accès de la Fichier manifest.xsf dans votre dossier de projet. N'oubliez pas d'échapper au chemin d'accès le Fichier manifest.xsf. Tout seul inverses (\) dans le chemin d'accès doivent être remplacés par deux barres obliques inverses (\).
  11. Enregistrez le fichier Manifest.xsf sur l'ordinateur en tant que le Fichier Register.js.
  12. Pour appeler le RegisterSolution méthode, double-cliquez sur le Register.js fichier qui vous avez créé.

Tester le formulaire

  1. Dans la Visual Studio AttachmentEncoding.NET 2003, project, Cliquez sur Démarrer sur la Debug menu. Cette commande démarre le formulaire InfoPath en mode Aperçu.
  2. Dans le formulaire InfoPath, tapez le chemin d'accès du fichier qui vous voulez joindre dans la zone de texte, puis cliquez surJoindre.

    Remarque Double-cliquez sur le Pièce jointe le contrôle à Vérifiez que le fichier est codé correctement.
  3. Cliquez sur Enregistrer. Recherchez le chemin d'accès que vous avez fourni dans le "Ajouter un Enregistrer bouton au formulaire InfoPath » section.
  4. Pour mettre fin au test, cliquez sur Fermer Aperçu.

Références

Pour plus d'informations sur l'en-tête du fichier pièce jointe format, visitez le site Web MSDN suivant :
Joindre des fichiers dans InfoPath 2003
http://msdn2.Microsoft.com/en-us/library/aa168351 (office.11) .aspx

Propriétés

Numéro d'article: 892730 - Dernière mise à jour: lundi 5 mars 2012 - Version: 0.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Office InfoPath 2003
Mots-clés : 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 892730
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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