如何進行編碼,並使用視覺 C# InfoPath 2003 中以程式設計的方式解碼附加檔案

文章翻譯 文章翻譯
文章編號: 892730 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

在 Microsoft Office InfoPath 2007 或 Microsoft Office InfoPath 2003 Service Pack 1 (SP1) 中,您可以使用 檔案附件 若要將檔案附加到 InfoPath 表單範本的控制項。在特定情況下,您可能想要編碼及再解碼附加至檔案 檔案附件 控制項。如此一來,您可以使用 Microsoft Visual C# 來建立 編碼器 類別和 解碼器 類別。然後,您可以使用 編碼器 類別和 解碼器 要編碼及解碼檔案類別附加檔案。

簡介

這篇文章會介紹如何進行編碼和使用 Microsoft Visual C# InfoPath 2003 中以程式設計的方式解碼附加檔案。如需如何執行這項操作,在 InfoPath 2010,或在 InfoPath 2007 資訊,請參閱下列網頁: 如何進行編碼,並使用視覺 C# InfoPath 2010 或 InfoPath 2007 中以程式設計的方式解碼附加檔案.

其他相關資訊

Microsoft 提供程式設計範例僅供說明,不做任何明示或默示的保證。這包含,但不會限制適售性或適合特定之默示擔保目的。本文假設您熟悉的程式設計對於示範所使用的語言以及用來建立的工具和偵錯程序。Microsoft 技術支援工程師可以協助說明功能的特定程序,但不是會修改這些範例以提供附加的功能或建構程序來滿足您特定的需求。

建立視覺化的 C# InfoPath 2003 專案

  1. 請啟動 Microsoft Visual Studio。NET 2003。
  2. 在上 檔案 功能表中,按一下然後按一下 專案.
  3. 新的專案 對話方塊中,按一下Visual C# 專案 Microsoft Office 的 InfoPath 專案中資料夾。
  4. 名稱 方塊中輸入AttachmentEncoding然後按一下[確定].
  5. 在 Microsoft Office 專案精靈] 中,按一下建立新的表單範本然後按一下完成.

    Microsoft Office 專案精靈] 建立新的 Visual Studio。NET 2003 專案時,名為 AttachmentEncoding。系統也會同時建立 InfoPath 表單範本。InfoPath 表單範本名為 AttachmentEncoding。

在 Visual Studio 中建立編碼器類別。NET 2003

  1. 在 [方案總管] 中,以滑鼠右鍵按一下AttachmentEncoding指向 新增然後再按一下 加入新項目.
  2. 加入新項目 對話方塊中,按一下類別範本 窗格中,型別InfoPathAttachmentEncoder.cs名稱 方塊中,然後再按一下 開啟.
  3. 取代 InfoPathAttachmentEncoder.cs 中的所有程式碼下列程式碼檔案。
    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());
    		}
    	}
    }

建立解碼器的類別,在 Visual Studio 中。NET 2003

  1. 在 [方案總管] 中,以滑鼠右鍵按一下AttachmentEncoding指向 新增然後再按一下 加入新項目.
  2. 加入新項目 對話方塊中,按一下類別範本 窗格中,型別InfoPathAttachmentDecoder.cs名稱 方塊中,然後再按一下 開啟.
  3. 取代 InfoPathAttachmentDecoder.cs 中的所有程式碼下列程式碼檔案。
    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; }
    		}
    	}	
    }
    
    

InfoPath 表單中加入的檔案附件控制項會與文字方塊控制項

  1. 在 AttachmentEncoding InfoPath 表單範本中,按一下 控制項設計工作 工作窗格。
  2. 控制項工作窗格中按一下檔案附件 在下插入控制項.
  3. 以滑鼠右鍵按一下 檔案附件 控制項,然後按一下 檔案附件內容.
  4. 檔案附件內容 對話方塊方塊中輸入 theAttachmentField欄位名稱 方塊中,然後再按一下 [確定].
  5. 控制項工作窗格中按一下文字方塊 在下插入控制項.
  6. 以滑鼠右鍵按一下 文字方塊 控制項,然後再按一下 文字方塊屬性.
  7. 文字方塊屬性 對話方塊中,型別 theAttachmentName欄位名稱 方塊中,然後再按一下 [確定].

InfoPath 表單中加入 [附加] 按鈕

  1. 控制項工作窗格中按一下按鈕 在下插入控制項.
  2. 以滑鼠右鍵按一下新的 按鈕 控制項,以及然後按一下 按鈕內容.
  3. 按鈕內容 對話方塊中,型別附加標籤 方塊中輸入btnAttach識別碼 方塊中,然後再按一下編輯表單程式碼.
  4. 加入下列程式碼複製到 btnAttach_OnClick 方法。
    //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();
    }	
    

新增到 InfoPath 表單的 [儲存] 按鈕

  1. 切換至 AttachmentEncoding InfoPath 表單範本。
  2. 控制項工作窗格中按一下按鈕 在下插入控制項.
  3. 以滑鼠右鍵按一下新的 按鈕 控制項,以及然後按一下 按鈕內容.
  4. 按鈕內容 對話方塊中,型別儲存檔案標籤 方塊中輸入btnSave識別碼 方塊中,然後再按一下編輯表單程式碼.
  5. 加入下列程式碼複製到 btnSave _OnClick 方法。
    //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>");
    }			
    
    附註 在這段程式碼,取代 <Path to="" save="" the="" file=""></Path> 要儲存的位置檔案。

請確定 InfoPath 表單範本是完全受信任

之前,您可以測試這個表單,InfoPath 表單範本必須完全受信任。您可以使用下列方法之一來確定InfoPath 表單範本是完全受信任:
  • 使用 Microsoft。NET Framework 1.1 組態公用程式若要授與完全信任給視覺化 C# 程式碼的權限。
  • 使用 RegForm 公用程式,從 InfoPath 軟體開發套件 (SDK),讓表單完全受信任的表單。這會授與完整信任視覺化 C# 程式碼使用權限。
  • 使用程式碼簽署憑證來數位簽署表單範本檔 (.xsn)。當您使用的程式碼簽署憑證來數位簽章表單範本檔案,系統會提示使用者信任的表單開啟時表單。這樣完全信任的表單。因此,就會完全信任權限授與視覺化 C# 程式碼。
  • 使用 IPFullTrust 從 InfoPath SDK,讓表單完全受信任的巨集表單。[ IPFullTrust 巨集自動執行設定資訊清單檔 (.xsf) 和表單對於完全信任,InfoPath 專案中的範本檔案,然後 IPFullTrust 巨集自動註冊表單範本。

    針對進一步瞭解如何安裝和使用巨集,請造訪下列Microsoft 開發人員網路 (MSDN) 網站:
    http://msdn2.microsoft.com/en-us/library/aa202736 (office.11).aspx
  • 在 InfoPath 中使用外部的自動化呼叫 RegisterSolution 方法。一般而言,這個方法只適用於表單開發因為已註冊的表單只有登錄個別的電腦。任何額外的表單,其他使用者必須註冊各自獨立的額外的表單電腦。不建議使用這個方法的其他表單。我們建議當您發佈表單時,先前的方法的任何一個。
由於此表單為表單開發,您可以使用最後一個方法。如果要執行這項操作,找出 AttachmentEncoding InfoPath 表單範本,然後按下列步驟進行:
  1. 在上 工具 功能表中,按一下 表單選項.
  2. 按一下 安全性 索引標籤。
  3. 按一下以清除 自動判定安全性根據表單的設計 (建議選項) 的層級 核取方塊。

    附註 InfoPath 無法自動偵測商務邏輯,需要完全信任權限。因此,您必須明確授與完整信任的權限。
  4. 按一下 完全信任然後按一下[確定].
  5. 關閉 AttachmentEncoding InfoPath 表單範本。如果提示您儲存變更時,請按一下 [是].

    附註 請勿關閉 Visual Studio。NET 2003 專案時。
  6. 在 Visual Studio。NET 2003 中,按兩下Manifest.xsf 在 [方案總管] 中的檔案。在 Manifest.xsf 檔案隨即開啟。
  7. 在 [根節點,找出 publishUrl 屬性。移除 publishUrl 屬性和值 publishUrl 屬性。
  8. 儲存您的變更,並關閉 Manifest.xsf檔案。
  9. 按一下 啟動按一下 執行,型別 [記事本]然後按一下[確定].
  10. 將下列程式碼加入至空白的文字檔。
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    附註 在這段程式碼,取代<project_folder_url></project_folder_url> 路徑在您的專案資料夾中的 Manifest.xsf 檔案。別忘了逸出的路徑Manifest.xsf 檔案。在路徑中所有的單一斜線 (\) 取代兩個反斜線 (\)。
  11. 儲存在與電腦上的 Manifest.xsf 檔案Register.js 檔案。
  12. 若要呼叫 RegisterSolution 方法中,按兩下 Register.js 檔案所建立。

測試表單

  1. 在 AttachmentEncoding Visual Studio 中。NET 2003 專案時,按一下 啟動 在上 偵錯 功能表。這會啟動InfoPath 表單處於預覽模式。
  2. 在 InfoPath 表單中,鍵入檔案的路徑,您想要附加在 [文字] 方塊中,然後按一下附加.

    附註 連按兩下 檔案附件 若要控制請確認該檔案正確的編碼。
  3. 按一下 儲存檔案.找出路徑,您所提供的 「 新增 儲存檔案 在 InfoPath 表單] 按鈕"一節。
  4. 若要結束測試,請按一下 關閉預覽.

?考

如需有關將檔案附加檔案標頭設定格式,請造訪下列 MSDN 網站:
在 InfoPath 2003 中的附加檔案
http://msdn2.microsoft.com/en-us/library/aa168351 (office.11).aspx

屬性

文章編號: 892730 - 上次校閱: 2012年3月5日 - 版次: 0.1
這篇文章中的資訊適用於:
  • Microsoft Office InfoPath 2003
關鍵字:?
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:892730
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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