Sposób kodowania i dekodowania pliku załącznika programowo przy użyciu programu Visual C# w programie InfoPath 2003

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 892730 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Streszczenie

W programie Microsoft Office InfoPath 2007 lub Microsoft Office InfoPath 2003 Service Pack 1 (SP1) można użyć Załącznik pliku formant, aby dołączyć plik do szablonu formularza programu InfoPath. W szczególnych okolicznościach może być kodowanie i dekodowanie pliku, który jest dołączony do Załącznik pliku formant. W takim przypadku można Microsoft Visual C# do utworzenia Koder Klasa i Dekoder Klasa. Następnie można użyć Koder Klasa i Dekoder Klasa kodowania i dekodowania pliku załącznik.

WPROWADZENIE

Ten artykuł zawiera wprowadzenie do kodowania i dekodowania pliku załącznika programowo przy użyciu programu Microsoft Visual C# w programie InfoPath 2003. Aby uzyskać informacje, jak to zrobić w 2010 programu InfoPath lub w programie InfoPath 2007, zobacz następującą stronę sieci web: 2517906 >.

Więcej informacji

Firma Microsoft podaje przykłady programowania tylko, bez jakichkolwiek gwarancji wyrażonych wprost lub domyślnie. To obejmuje, ale nie jest ograniczona do domniemanych gwarancji jakości lub przydatności do określonego cel. W tym artykule założono, że czytelnik jest obeznany z programowaniem prezentowany język i narzędzia, które są używane do tworzenia i debugowania procedur. Wykwalifikowani pracownicy pomocy technicznej firmy Microsoft mogą pomóc w wyjaśnieniu funkcjonalność określona procedura, ale nie będą modyfikować tych Przykłady ani dodatkowych funkcji i konstruować nowych procedur w celu zaspokojenia sieci szczególne wymagania.

Tworzenie projektu Visual C# programu InfoPath 2003

  1. Uruchom program Microsoft Visual Studio.NET 2003.
  2. Na Plik menu, kliknij przyciskNowy, a następnie kliknij przycisk Projekt.
  3. W Nowy projekt okno dialogowe, kliknij przyciskProgram Visual C# projektów w projektach programu Microsoft Office InfoPath folder.
  4. W Nazwa pole typuAttachmentEncoding, a następnie kliknij przyciskOK.
  5. Kliknij w Kreatora programu Microsoft Office ProjectTworzenie nowego szablonu formularza, a następnie kliknij przyciskZakończ.

    Tworzy Kreatora programu Microsoft Office Project nowy program Visual Studio.Project 2003 netto o nazwie AttachmentEncoding. Osoba Tworzony jest także szablon formularza programu InfoPath. Szablon formularza programu InfoPath jest o nazwie AttachmentEncoding.

Tworzenie klasy kodera w programie Visual Studio.NET 2003

  1. W oknie Solution Explorer kliknij prawym przyciskiem myszyAttachmentEncoding, wskaż polecenie Dodawanie, a następnie Kliknij przycisk Dodaj nowy element.
  2. W Dodaj nowy element okno dialogowe, kliknij przyciskKlasa w Szablon Okienko typuInfoPathAttachmentEncoder.cs wNazwa a następnie kliknij przycisk Otwórz.
  3. Zamienić cały kod InfoPathAttachmentEncoder.cs plik z następującego kodu.
    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());
    		}
    	}
    }

Utwórz klasę dekoder w programie Visual Studio.NET 2003

  1. W oknie Solution Explorer kliknij prawym przyciskiem myszyAttachmentEncoding, wskaż polecenie Dodawanie, a następnie Kliknij przycisk Dodaj nowy element.
  2. W Dodaj nowy element okno dialogowe, kliknij przyciskKlasa w Szablon Okienko typuInfoPathAttachmentDecoder.cs wNazwa a następnie kliknij przycisk Otwórz.
  3. Zamienić cały kod InfoPathAttachmentDecoder.cs plik z następującego kodu.
    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; }
    		}
    	}	
    }
    
    

Dodać formant załącznika pliku i formantu pola tekstowego do formularza programu InfoPath

  1. W szablonie formularza programu AttachmentEncoding InfoPath Kliknij przycisk Formanty w Projektuj zadania zadania okienko.
  2. W Formantykliknij polecenie okienko zadańPlik Załącznik w obszarzeWstawianie formantów.
  3. Kliknij prawym przyciskiem myszy Załącznik pliku kontroli, a następnie kliknij przycisk Właściwości pliku załącznika.
  4. W Właściwości pliku załącznika okno dialogowe pole typu theAttachmentField w Pole Nazwa a następnie kliknij przycisk OK.
  5. W Formantykliknij polecenie okienko zadańPole tekstowe w obszarzeWstawianie formantów.
  6. Kliknij prawym przyciskiem myszy Pole tekstowe formant, a następnie Kliknij przycisk Właściwości pola tekstowego.
  7. W Właściwości pola tekstowego okno dialogowe Typ theAttachmentName w Pole Nazwa a następnie kliknij przycisk OK.

Dodaj przycisk Dołącz do formularza programu InfoPath

  1. W Formantykliknij polecenie okienko zadańPrzycisk w obszarzeWstawianie formantów.
  2. Kliknij prawym przyciskiem myszy nowy Przycisk kontrola, oraz następnie kliknij przycisk Właściwości przycisku.
  3. W Właściwości przycisku okno dialogowe, typDołącz w Etykieta pole typubtnAttach w IDENTYFIKATOR a następnie kliknij przyciskEdytuj kod formularza.
  4. Dodaj następujący kod do 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();
    }	
    

Dodawanie przycisku Zapisz formularz programu InfoPath

  1. Przełącz się do formularza programu AttachmentEncoding InfoPath szablon.
  2. W Formantykliknij polecenie okienko zadańPrzycisk w obszarzeWstawianie formantów.
  3. Kliknij prawym przyciskiem myszy nowy Przycisk kontrola, oraz następnie kliknij przycisk Właściwości przycisku.
  4. W Właściwości przycisku okno dialogowe, typZapisz w Etykieta pole typubtnSave w IDENTYFIKATOR a następnie kliknij przyciskEdytuj kod formularza.
  5. Dodaj następujący kod do 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>");
    }			
    
    Uwaga W tym kodzie Zamień <path to="" save="" the="" file=""></path> z lokalizacji, w której chcesz zapisać plik.

Upewnij się, że szablon formularza programu InfoPath jest w pełni zaufany

Przed przetestować ten formularz szablon formularza programu InfoPath musi być w pełni zaufany. Użyj jednej z następujących metod upewnij się Aby szablon formularza programu InfoPath jest w pełni zaufane:
  • Za pomocą programu Microsoft.Narzędzie NET Framework 1.1 Configuration Aby udzielić uprawnień pełne zaufanie tylko dla kodu Visual C#.
  • Użyj narzędzia RegForm z oprogramowania programu InfoPath Development Kit (SDK) dodać do formularza w pełni zaufany formularz. Dzięki temu pełnego Zaufania uprawnień do kodu Visual C#.
  • Aby cyfrowo podpisać formularz za pomocą certyfikatu podpisywania kodu Plik szablonu (xsn). Kiedy używać podpisywania kodu do cyfrowego podpisywania Plik szablonu formularza użytkownicy będą monitowani o zaufania po otwarciu formularza w formularzu. Dzięki temu formularza, w pełni zaufane. Dlatego są uprawnienia pełnego zaufania przyznane kodu Visual C#.
  • Użyj IPFullTrust makra z zestawu SDK programu InfoPath ma być całkowicie zaufanych w formularzu. W IPFullTrust makro automatyzuje ustawienie pliku manifestu (xsf) i formularza Plik szablonu w projekcie programu InfoPath dla pełne zaufanie, a następnie IPFullTrust makra są automatycznie rejestruje szablonu formularza.

    Dla więcej informacji na temat instalowania i używania makr, odwiedź witrynę Witryna sieci Web Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/aa202736 (office.11) .aspx
  • Użyć zewnętrznego automatyzacji do nawiązania połączenia w programie InfoPath RegisterSolution Metoda. Zazwyczaj ta metoda jest używana tylko do projektowania formularzy Ponieważ formularz zarejestrowanych rejestruje tylko dla pojedynczego komputera. Dla każdego dodatkowe formularze innym użytkownikom należy zarejestrować dodatkowe formularze na swoich własnych komputery. Nie zaleca tej metody dla dodatkowych formularzy. Firma Microsoft zaleca z jednej z poprzednich metod podczas publikowania formularza.
Ponieważ ten formularz jest opracowywana formularza, można użyć Ostatnia metoda. Aby to zrobić, zlokalizuj formularz programu AttachmentEncoding InfoPath szablon, a następnie wykonaj następujące kroki:
  1. Na Narzędzia menu, kliknij przycisk Formularz Opcje.
  2. Kliknij przycisk Zabezpieczenia Karta.
  3. Kliknij, aby wyczyścić Automatycznie określić zabezpieczeń poziom, na podstawie projektu formularza (zalecane) pole wyboru.

    Uwaga Program InfoPath nie może automatycznie wykryć logiki biznesowej, wymaga uprawnień pełnego zaufania. W związku z tym należy jawnie udzielić pełnego Zaufania uprawnienia.
  4. Kliknij przycisk Pełne zaufanie, a następnie kliknij przyciskOK.
  5. Zamknij szablon formularza programu AttachmentEncoding InfoPath. Jeśli zostanie wyświetlony monit o zapisanie zmian, kliknij przycisk Tak.

    Uwaga Nie można zamknąć programu Visual Studio.Project 2003 netto.
  6. W programie Visual Studio.NET 2003, kliknij dwukrotnieManifest.xsf plik w oknie Solution Explorer. Plik Manifest.xsf zostanie otwarty.
  7. W węźle głównym zlokalizować publishUrl atrybut. Usuń publishUrl atrybut i wartość publishUrl atrybut.
  8. Zapisz zmiany i zamknąć Manifest.xsf plik.
  9. Kliknij przycisk Start, kliknij przycisk Uruchom, Typ Notatnik, a następnie kliknij przyciskOK.
  10. Dodaj następujący kod do pliku tekstowego puste.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    Uwaga W tym kodzie Zamień<project_folder_url></project_folder_url> ze ścieżką Plik manifest.xsf w folderze projektu. Pamiętaj, aby wyjść ścieżki Plik manifest.xsf. Wszystkie pojedyncze odwrócone (\) w ścieżce musi zostać zastąpiony. dwa ukośniki odwrotne (\).
  11. Zapisz plik Manifest.xsf na komputerze jako Plik register.js.
  12. Wywołanie RegisterSolution Metoda, kliknij dwukrotnie ikonę Register.js plik, który zostanie utworzony.

Przetestuj formularz

  1. W AttachmentEncoding programu Visual Studio.Project 2003 netto Kliknij przycisk Start na Program Debug menu. Spowoduje to uruchomienie formularz programu InfoPath w trybie podglądu.
  2. W formularzu programu InfoPath wpisz ścieżkę pliku, który Aby dołączyć w polu tekstowym, a następnie kliknij przyciskDołącz.

    Uwaga Kliknij dwukrotnie ikonę Załącznik pliku formant Upewnij się, że plik jest poprawnie zakodowany.
  3. Kliknij przycisk Zapisz. Zlokalizuj ścieżkę że w "Dodaj Zapisz przycisk do formularza programu InfoPath sekcja.
  4. Kliknij, aby zakończyć test, Zamknij Podgląd.

Materiały referencyjne

Aby uzyskać więcej informacji o nagłówku załącznik pliku Format, odwiedź następującą witrynę MSDN w sieci Web:
Dołączanie plików w programie InfoPath 2003
http://msdn2.microsoft.com/en-us/library/aa168351 (office.11) .aspx

Właściwości

Numer ID artykułu: 892730 - Ostatnia weryfikacja: 17 września 2011 - Weryfikacja: 3.0
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Office InfoPath 2003
Słowa kluczowe: 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtpl
Przetłumaczone maszynowo
WAŻNE: Ten artykuł nie został przetłumaczony przez człowieka, tylko przez oprogramowanie do tłumaczenia maszynowego firmy Microsoft. Firma Microsoft oferuje zarówno artykuły tłumaczone przez ludzi, jak i artykuły tłumaczone maszynowo, dzięki czemu każdy użytkownik może uzyskać dostęp do całej zawartości bazy wiedzy Knowledge Base we własnym języku. Prosimy jednak pamiętać, że artykuły przetłumaczone maszynowo nie zawsze są doskonałe. Mogą zawierać błędy słownictwa, składni i gramatyki, przypominające błędy robione przez osoby, dla których język użytkownika nie jest językiem ojczystym. Firma Microsoft nie odpowiada za wszelkie nieścisłości, błędy lub szkody spowodowane nieprawidłowym tłumaczeniem zawartości oraz za wykorzystanie tej zawartości przez klientów. Oprogramowanie do tłumaczenia maszynowego jest często aktualizowane przez firmę Microsoft.
Anglojęzyczna wersja tego artykułu to:892730

Przekaż opinię

 

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