Come codificare e decodificare un file allegato a livello di programmazione utilizzando C# in InfoPath 2003

Traduzione articoli Traduzione articoli
Identificativo articolo: 892730 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In InfoPath 2007 di Microsoft Office o Microsoft Office InfoPath 2003 Service Pack 1 (SP1), č possibile utilizzare un File allegato controllo per allegare un file al modello di modulo di InfoPath. In determinate circostanze, č possibile codificare e decodificare quindi il file in cui č collegato la File allegato controllo. In questo caso, č possibile utilizzare Microsoft Visual C# per creare un Codificatore classe e un Decoder classe. Quindi, č possibile utilizzare il Codificatore classe e il Decoder classe per codificare e decodificare il file allegato.

INTRODUZIONE

In questo articolo viene illustrato come codificare e decodificare un file allegato a livello di programmazione utilizzando Microsoft Visual C# in InfoPath 2003. Per informazioni su come effettuare questa operazione nel 2010 InfoPath o in InfoPath 2007, vedere la seguente pagina web: Come per codificare e decodificare un file allegato a livello di programmazione utilizzando C# nel 2010 InfoPath o in InfoPath 2007.

Informazioni

Microsoft fornisce esempi di programmazione solo scopo illustrativo e senza alcuna garanzia espressa o implicita. Questo include, ma non č limitato per le garanzie implicite di commerciabilitā o idoneitā per un particolare scopo. In questo articolo si presuppone che abbia familiaritā con la programmazione lingua in questione e gli strumenti che consentono di creare e le procedure di debug. Gli esperti Microsoft possono spiegare il funzionalitā di una particolare procedura, ma in nessun caso a modificare questi esempi per fornire funzionalitā aggiuntive o creare procedure atte a soddisfare le requisiti specifici.

Creare un progetto di Visual C# InfoPath 2003

  1. Avviare Microsoft Visual Studio.NET 2003.
  2. Nel File menu, fare clic suNuovo, quindi fare clic su Progetto.
  3. Nel Nuovo progetto Nella finestra di dialogo, fare clic suProgetti di Visual C# nei progetti di InfoPath Microsoft Office cartella.
  4. Nel Nome digitareAttachmentEncoding, quindi fare clic suOK.
  5. La creazione guidata progetto di Microsoft Office, fare clic suCreare un nuovo modello di modulo, quindi fare clic suFine.

    La creazione guidata progetto di Microsoft Office crea un nuovi progetti di Visual Studio.NET 2003 progetto č denominato AttachmentEncoding. Un Viene inoltre creato il modello di modulo di InfoPath. Modello di modulo di InfoPath denominato AttachmentEncoding.

Creare una classe Encoder in Visual Studio.NET 2003

  1. In Esplora soluzioni, pulsante destro del mouseAttachmentEncoding, scegliere Aggiungere, quindi Fare clic su Aggiungi nuovo elemento.
  2. Nel Aggiungi nuovo elemento Nella finestra di dialogo, fare clic suClasse nel Modello tipo riquadroInfoPathAttachmentEncoder.cs nelNome casella e quindi scegliere Apri.
  3. Sostituire il codice di InfoPathAttachmentEncoder.cs file con il codice riportato di seguito.
    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());
    		}
    	}
    }

Creare una classe di Decoder in Visual Studio.NET 2003

  1. In Esplora soluzioni, pulsante destro del mouseAttachmentEncoding, scegliere Aggiungere, quindi Fare clic su Aggiungi nuovo elemento.
  2. Nel Aggiungi nuovo elemento Nella finestra di dialogo, fare clic suClasse nel Modello tipo riquadroInfoPathAttachmentDecoder.cs nelNome casella e quindi scegliere Apri.
  3. Sostituire il codice di InfoPathAttachmentDecoder.cs file con il codice riportato di seguito.
    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; }
    		}
    	}	
    }
    
    

Aggiungere un controllo File allegato e un controllo casella di testo nel modulo di InfoPath

  1. Nel modello di modulo AttachmentEncoding InfoPath Fare clic su Controlli nel Attivitā di progettazione attivitā riquadro.
  2. Nel Controlliriquadro attivitā, fare clic suFile Allegato Nella casella di gruppoInserire i controlli.
  3. Pulsante destro del mouse il File allegato controllo, e quindi fare clic su Proprietā file allegato.
  4. Nel Proprietā file allegato finestra di dialogo digitare theAttachmentField nel Campo Nome casella e quindi scegliere OK.
  5. Nel Controlliriquadro attivitā, fare clic suCasella di testo Nella casella di gruppoInserire i controlli.
  6. Pulsante destro del mouse il Casella di testo controllo, quindi Fare clic su Proprietā casella di testo.
  7. Nel Proprietā casella di testo Nella finestra di dialogo tipo theAttachmentName nel Campo Nome casella e quindi scegliere OK.

Aggiungere un pulsante Allega il modulo di InfoPath

  1. Nel Controlliriquadro attivitā, fare clic suPulsante Nella casella di gruppoInserire i controlli.
  2. Fare di nuovo Pulsante controllo, e quindi fare clic su Proprietā del pulsante.
  3. Nel Proprietā del pulsante Nella finestra di dialogo tipoAllegare nel Etichetta digitarebtnAttach nel ID casella e quindi scegliereModifica codice modulo.
  4. Aggiungere il codice seguente nel btnAttach_OnClick metodo.
    //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();
    }	
    

Aggiungere un pulsante Salva il modulo di InfoPath

  1. Passare al modulo di AttachmentEncoding InfoPath modello.
  2. Nel Controlliriquadro attivitā, fare clic suPulsante Nella casella di gruppoInserire i controlli.
  3. Fare di nuovo Pulsante controllo, e quindi fare clic su Proprietā del pulsante.
  4. Nel Proprietā del pulsante Nella finestra di dialogo tipoSalva nel Etichetta digitarebtnSave nel ID casella e quindi scegliereModifica codice modulo.
  5. Aggiungere il codice seguente nel btnSave _OnClick metodo.
    //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 In questo codice, sostituire <Path to="" save="" the="" file=""></Path> con la posizione in cui si desidera salvare il file.

Assicurarsi che il modello di modulo di InfoPath č completamente attendibile

Prima di prova di questo modulo, il modello di modulo di InfoPath deve essere completamente attendibile. Č possibile utilizzare uno dei metodi riportati di seguito per assicurarsi che che il modello di modulo di InfoPath č completamente attendibile:
  • Utilizzare Microsoft.NET Framework 1.1 Configuration utility Per concedere autorizzazioni di attendibilitā totale solo per il codice C#.
  • Utilizzare l'utilitā RegForm dal Software di InfoPath Development Kit (SDK) per rendere il modulo in un modulo completamente attendibile. Questo garantisce la completa Attendibilitā delle autorizzazioni per il codice C#.
  • Utilizzare un certificato di firma del codice per firmare digitalmente il modulo file di modello (con estensione xsn). Quando si utilizza un certificato di firma del codice per la firma digitale il file di modello di modulo agli utenti vengono richiesto di accettare il modulo quando aprono il modulo. In questo modo il modulo completamente attendibile. Pertanto, sono le autorizzazioni di attendibilitā totale concedere al codice C#.
  • Utilizzare il IPFullTrust macro da InfoPath SDK per rendere il modulo completamente attendibile modulo. Il IPFullTrust macro consente di automatizzare l'impostazione del file manifesto (. xsf) e il modulo file di modello del progetto di InfoPath per l'attendibilitā totale e quindi il IPFullTrust macro registra automaticamente il modello di modulo.

    Per ulteriori informazioni su come installare e utilizzare la macro, visitare il seguente Sito Web Microsoft Developer Network (MSDN):
    aspx http://msdn2.microsoft.com/en-us/library/aa202736 (Office. 11)
  • Utilizzare l'automazione esterna in InfoPath per chiamare il RegisterSolution metodo. In genere, questo metodo viene utilizzato solo per lo sviluppo di moduli Poiché un modulo registrato registra solo per un singolo computer. Per qualsiasi moduli aggiuntivi, gli altri utenti devono registrare i moduli aggiuntivi per proprio conto computer. Si sconsiglia di questo metodo per i moduli aggiuntivi. Si consiglia di uno dei metodi precedenti, quando si pubblica il modulo.
Poiché questo modulo č in fase di sviluppo di form, č possibile utilizzare il ultima chiamata al metodo. A tale scopo, individuare il modulo di AttachmentEncoding InfoPath modello e quindi attenersi alla seguente procedura:
  1. Nel Strumenti menu, fare clic su Modulo Opzioni.
  2. Scegliere il Protezione scheda.
  3. Fare clic per deselezionare la Determinare automaticamente la protezione livello in base alla progettazione del modulo (scelta consigliata) casella di controllo.

    Nota InfoPath č in grado di rilevare automaticamente la logica di business che richiede autorizzazioni di attendibilitā totale. Di conseguenza, č necessario concedere esplicitamente Full Le autorizzazioni di attendibilitā.
  4. Fare clic su L'attendibilitā totale, quindi fare clic suOK.
  5. Chiudere il modello di modulo AttachmentEncoding InfoPath. Se viene chiesto di salvare le modifiche, fare clic su .

    Nota Non chiudere Visual Studio.NET 2003 progetto.
  6. In Visual Studio.NET 2003, fare doppio clic su diManifest file in Esplora soluzioni. Il file manifest verrā visualizzata.
  7. Nel nodo principale, individuare il publishUrl attributo. Rimuovere il publishUrl attributo e il valore di publishUrl attributo.
  8. Salvare le modifiche e chiudere il file manifest. xsf file.
  9. Fare clic su Avviare, fare clic su Eseguire, tipo blocco note, quindi fare clic suOK.
  10. Aggiungere il seguente codice al file di testo vuoto.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    Nota In questo codice, sostituire<project_folder_url></project_folder_url> con il percorso del File manifest nella cartella del progetto. Ricordarsi di escape il percorso del File manifest. xsf. Tutti i singole rovesciate (\) nel percorso devono essere sostituite con due barre rovesciate (\).
  11. Salvare il file manifest sul computer come il File Register.js.
  12. Per chiamare il RegisterSolution metodo, fare doppio clic su di Register.js file č creato.

Il test del form

  1. In AttachmentEncoding Visual Studio.NET 2003 progetto, Fare clic su Avviare nel Eseguire il debug dal menu. Verrā avviata il modulo di InfoPath in modalitā anteprima.
  2. Il modulo di InfoPath, digitare il percorso del file che si desidera allegare nella casella di testo e quindi fare clic suAllegare.

    Nota Fare doppio clic su di File allegato il controllo Verificare che il file č codificato correttamente.
  3. Fare clic su Salva. Individuare il percorso che si prevista la "Aggiungi un Salva pulsante per il modulo di InfoPath" sezione.
  4. Per terminare la prova, fare clic su Chiudere Anteprima.

Riferimenti

Per ulteriori informazioni nell'intestazione del file allegato formattare, visitare il seguente sito Web MSDN:
Per allegare file in InfoPath 2003
aspx http://msdn2.microsoft.com/en-us/library/aa168351 (Office. 11)

Proprietā

Identificativo articolo: 892730 - Ultima modifica: lunedė 5 marzo 2012 - Revisione: 0.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Office InfoPath 2003
Chiavi: 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtit
Traduzione automatica articoli
Il presente articolo č stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non č sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pių o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non č la sua. Microsoft non č responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 892730
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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