Cum să encode și decode un atașament de fișier programatic utilizând Visual C# în InfoPath 2003

Traduceri articole Traduceri articole
ID articol: 892730 - View products that this article applies to.
Măriți totul | Reduceți totul

În această pagină

REZUMAT

În Microsoft Office InfoPath 2007 sau în Microsoft Office InfoPath 2003 Service Pack 1 (SP1), puteți utiliza un Atașare fișier controlul pentru a atașa un fișier la șablonul formular InfoPath. În anumite împrejurări, poate doriți să encode și decode apoi fișierul atașat Atașare fișier control. În acest caz, utilizați Microsoft Visual C# pentru a crea un Encoder Clasa și un Decodor clasa. Apoi, aveți posibilitatea să utilizați Encoder Clasa și Decodor Clasa encode și decode fișierul atașare.

INTRODUCERE

Acest articol introduce cum să encode și decode un atașament de fișier prin program, utilizând Microsoft Visual C# în InfoPath 2003. Pentru informații despre cum să facă acest lucru în InfoPath 2010 sau în InfoPath 2007, consultați următoarea pagină web: Cum pentru a codifica și de a decoda un atașament de fișier programatic utilizând Visual C# în InfoPath 2010 sau în InfoPath 2007.

INFORMAȚII SUPLIMENTARE

Microsoft furnizează exemple de programare pentru ilustrare fără garanție, fie explicite sau implicite. Aceasta include, dar nu se limitează la garan?iile implicite de vandabilitate sau aplicabilitate pentru un anumit scop. Acest articol presupune că sunteți familiarizat cu programare limba în care este fiind demonstrat și cu instrumente care sunt utilizate pentru a crea și pentru a depana proceduri. Specialiștii în asistență Microsoft pot ajuta la explicarea funcționalitatea unei proceduri, dar acestea nu va modifica aceste exemple pentru a oferi funcționalitatea adăugată sau construi procedurile pentru a satisface dumneavoastră cerin?ele specifice.

Crea un proiect Visual C# InfoPath 2003

  1. Porniți Microsoft Visual Studio.NET 2003.
  2. Pe Fișier meniu, faceți clic peNoi, apoi faceți clic pe Proiect.
  3. În Proiect nou caseta de dialog, faceți clic peVisual C# proiecte în proiectele Microsoft Office InfoPath folderul.
  4. În nume caseta, tipAttachmentEncoding, apoi faceți clic peok.
  5. În Expertul de proiect Microsoft Office, faceți clic peCreați un nou șablon formă, apoi faceți clic peTerminare.

    Expertul de proiect Microsoft Office creează o nou Visual Studio.NET 2003 proiect care este numit AttachmentEncoding. Un Șablonul formular InfoPath este, de asemenea, a creat. Șablonul formular InfoPath este numit AttachmentEncoding.

Creați o clasă Encoder în Visual Studio.NET 2003

  1. În solu?ie de Explorer, faceți clic dreapta peAttachmentEncoding, indicați spre Adăuga, apoi Faceți clic pe Adăugare element nou.
  2. În Adăugare element nou caseta de dialog, faceți clic peClasa în Șablon panoul, tipInfoPathAttachmentEncoder.cs înnume casetă și apoi faceți clic pe Deschise.
  3. Înlocuiți toate codul în InfoPathAttachmentEncoder.cs Fișier cu următorul cod.
    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());
    		}
    	}
    }

Creați o clasă decodor în Visual Studio.NET 2003

  1. În solu?ie de Explorer, faceți clic dreapta peAttachmentEncoding, indicați spre Adăuga, apoi Faceți clic pe Adăugare element nou.
  2. În Adăugare element nou caseta de dialog, faceți clic peClasa în Șablon panoul, tipInfoPathAttachmentDecoder.cs înnume casetă și apoi faceți clic pe Deschise.
  3. Înlocuiți toate codul în InfoPathAttachmentDecoder.cs Fișier cu următorul cod.
    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; }
    		}
    	}	
    }
    
    

Adăugați un control fișier atașat și un control casetă Text la formularul InfoPath

  1. În șablonul formular AttachmentEncoding InfoPath, Faceți clic pe Controale în Activități de proiectare activitate panoul.
  2. În Controalepanoul de activitate, faceți clic peFișier Atașare în conformitate cuInserare controale.
  3. Faceți clic dreapta pe Atașare fișier control, apoi faceți clic pe Proprietățile fișierului atașament.
  4. În Proprietățile fișierului atașament dialog caseta, tip theAttachmentField în Câmp nume casetă și apoi faceți clic pe ok.
  5. În Controalepanoul de activitate, faceți clic peCasetă text în conformitate cuInserare controale.
  6. Faceți clic dreapta pe Casetă text controlul, apoi Faceți clic pe Proprietăți casetă text.
  7. În Proprietăți casetă text caseta de dialog, tip theAttachmentName în Câmp nume casetă și apoi faceți clic pe ok.

Adăugați un buton de atașare la formularul InfoPath

  1. În Controalepanoul de activitate, faceți clic peButon în conformitate cuInserare controale.
  2. Faceți clic dreapta pe noul Buton control, și apoi faceți clic pe Proprietăți buton.
  3. În Proprietăți buton caseta de dialog, tipAtașați în Eticheta caseta, tipbtnAttach în ID-UL casetă și apoi faceți clic peEditare formular cod.
  4. Adăugați următorul cod în btnAttach_OnClick metoda.
    //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();
    }	
    

Adăugați un buton de salvare în formular InfoPath

  1. Comutați la formularul AttachmentEncoding InfoPath șablon.
  2. În Controalepanoul de activitate, faceți clic peButon în conformitate cuInserare controale.
  3. Faceți clic dreapta pe noul Buton control, și apoi faceți clic pe Proprietăți buton.
  4. În Proprietăți buton caseta de dialog, tipSalvare în Eticheta caseta, tipbtnSave în ID-UL casetă și apoi faceți clic peEditare formular cod.
  5. Adăugați următorul cod în btnSave _OnClick metoda.
    //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>");
    }			
    
    Notă În acest cod, înlocuiți <Path to="" save="" the="" file=""></Path> cu locația unde doriți să salvați Fișier.

Asigurați-vă că șablonul formular InfoPath este pe deplin de încredere

Înainte se poate testa acest formular, șablonul formular InfoPath trebuie să fie pe deplin de încredere. Utilizați una dintre următoarele metode pentru a asigurați-vă că că șablonul formular InfoPath este pe deplin de încredere:
  • Utilizați Microsoft.NET cadru 1.1 Configuration Utilitate pentru a acorda încredere deplină permisiuni numai la codul Visual C#.
  • Utilizați utilitarul RegForm din InfoPath software-ul Development Kit (SDK) pentru a forma un formular de încredere deplină. Aceasta acordă plin Încredere permisiuni pentru codul Visual C#.
  • Folosesc un certificat de Semnare cod să semneze digital formularul Fișier șablon (.xsn). Când utilizați un certificat semnare cod pentru a semna digital fișierul șablon formular, utilizatorilor li se solicită să aibă încredere în formular când deschid forma. Acest lucru face ca forma pe deplin de încredere. Prin urmare, încredere deplină permisiunile sunt acordă codul Visual C#.
  • Utilizarea IPFullTrust macrocomandă din InfoPath SDK pentru a forma o încredere deplină forma. The IPFullTrust macrocomandă automatizează fișierul manifest (.xsf) ?i forma Fișier șablon în proiectul InfoPath pentru încredere deplină, apoi IPFullTrust macrocomandă înregistrează automat șablonul formular.

    Pentru mai multe informații despre cum să instalați și să utilizați macrocomanda, vizitați următoarele Site-ul Web Microsoft Developer Network (MSDN):
    http://msdn2.Microsoft.com/en-us/library/aa202736 (office.11) .aspx
  • Utilizați automatizare externă în InfoPath pentru a apela RegisterSolution metoda. De obicei, această metodă este utilizată numai pentru dezvoltarea formă deoarece un formular înregistrate numai registrele de individual computer. Pentru orice formulare suplimentare, alți utilizatori trebuie să se înregistreze formularele suplimentare pe cont propriu computere. Nu recomandăm această metodă pentru formulare suplimentare. Vă recomandăm oricare dintre metodele anterioare când publicați forma.
Deoarece acest formular este în curs de dezvoltare forma, aveți posibilitatea să utilizați ultima metodă. Pentru aceasta, găsiți formular AttachmentEncoding InfoPath șablon, apoi urmați acești pași:
  1. Pe Instrumente meniu, faceți clic pe Forma Opțiuni.
  2. Faceți clic pe Securitate fila.
  3. Faceți clic pentru a debifa Determina automat de securitate nivel bazat pe proiectarea formularului (recomandat) caseta de selectare.

    Notă InfoPath nu poate detecta automat logica de afaceri care necesită permisiuni de încredere deplină. Prin urmare, trebuie să acorde explicit plin Încredere permisiunile.
  4. Faceți clic pe Încredere deplină, apoi faceți clic peok.
  5. Închideți șablonul formular AttachmentEncoding InfoPath. Dacă vi se solicită să salvați modificările, faceți clic pe da.

    Notă Nu închideți Visual Studio.Proiectul NET 2003.
  6. În Visual Studio.NET 2003, faceți dublu clic peManifest.xsf Fișier în solu?ie Explorer. Fișierul Manifest.xsf se deschide.
  7. În nodul rădăcină, localizați publishUrl atribut. Elimina publishUrl atribut și valoarea publishUrl atribut.
  8. Salvați modificările și închideți Manifest.xsf Fișier.
  9. Faceți clic pe Start, faceți clic pe A alerga, tip Notepad, apoi faceți clic peok.
  10. Adăugați următorul cod la fișierul text gol.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    Notă În acest cod, înlocuiți<project_folder_url></project_folder_url> cu calea Fișierul manifest.xsf din folderul de proiect. Amintiți-vă pentru a scăpa de calea Fișier manifest.xsf. Bare oblice toate singur inverse (\) în calea trebuie înlocuit cu două bare oblice inverse (\).
  11. Salvați fișierul pe computer ca Manifest.xsf Fișier Register.js.
  12. Pentru a apela RegisterSolution metoda, faceți dublu clic pe Register.js Fișier care ați creat.

Forma de testare

  1. În AttachmentEncoding Visual Studio.Proiectul NET 2003, Faceți clic pe Start pe Depanare meniul. Se pornește formularul InfoPath în modul Previzualizare.
  2. În formular InfoPath, tastați calea fișierului care doriți să atașați în caseta de text, și apoi faceți clic peAtașați.

    Notă Faceți dublu clic pe Atașare fișier controlul Verificați că fișierul este codificată corect.
  3. Faceți clic pe Salvare. Găsiți calea care le în "adăugați un Salvare buton la formular InfoPath" secțiunea.
  4. La sfârșitul testului, faceți clic pe Închide Previzualizare.

REFERINȚE

Pentru mai multe informații despre antetul de atașare fișier format, vizitați următorul site MSDN Web:
Atașați fișiere în InfoPath 2003
http://msdn2.Microsoft.com/en-us/library/aa168351 (office.11) .aspx

Proprietă?i

ID articol: 892730 - Ultima examinare: 5 martie 2012 - Revizie: 0.1
SE APLICĂ LA:
  • Microsoft Office InfoPath 2003
Cuvinte cheie: 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtro
Traducere automată
IMPORTANT: Acest articol a fost tradus de software-ul de traducere automată Microsoft, si nu de un traducător. Microsoft vă oferă atât articole traduse de persoane, cât și articole traduse automat, astfel incat aveti access la toate articolele din Baza noastră de informatii în limba dvs. materna. Totuși, un articol tradus automat nu este întotdeauna perfect. Acesta poate conține greșeli de vocabular, sintaxă sau gramatică, la fel cum un vorbitor străin poate face greșeli vorbind limba dvs. materna. Compania Microsoft nu este responsabilă pentru nici o inexactitate, eroare sau daună cauzată de traducerea necorespunzătoare a conținutului sau de utilizarea traducerii necorespunzătoare de către clienții nostri. De asemenea, Microsoft actualizează frecvent software-ul de traducere automată.
Face?i clic aici pentru a vizualiza versiunea în limba engleză a acestui articol:892730

Trimite?i feedback

 

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