文書番号: 892730 - 最終更新日: 2007年1月30日 - リビジョン: 2.2

エンコードおよび InfoPath では Visual C# を使用してプログラムで添付ファイルをデコードする方法

目次

すべて展開する | すべて折りたたむ

概要

Microsoft Office InfoPath 2007 で または Microsoft Office InfoPath 2003 Service Pack 1 (SP1)、ファイルを InfoPath フォーム テンプレートに添付する 添付ファイル コントロールを使用できます。 特定の状況でたいし、 添付ファイル コントロールに関連付けられているファイルのデコードし、エンコードします。 このケースで使えます Microsoft Visual C# の場合、 エンコーダー クラスと、 デコーダー クラスを作成します。 次を使用して、 エンコーダー クラスと、 デコーダー クラス エンコードおよびデコード、このファイルの添付ファイル

概要

ここではエンコードし、Microsoft Visual C# を使用してプログラムで添付ファイルをデコードする方法を紹介します。

詳細

マイクロソフトは提供プログラミング言語の使用方法の一例としてのみ、姿表現または暗黙に提供します。 これはに含まれますに、黙示または商品性および特定目的に対する適合性の黙示保証は一切制限はありません。 この資料ではであると見なすは、例示されているプログラミング言語を作成したりプロシージャをデバッグするためのツールと使い慣れた。 マイクロソフト サポート エンジニアに、特定のプロシージャの機能について説明する役立ちますが追加機能を提供する構築手順、特定の要件を次の例は変更されません。

Visual C# InfoPath 2003 プロジェクトを作成します。

  1. Microsoft Visual Studio .NET 2003年を開始します。
  2. ファイル ] メニューの [には [ 新規作成 ] をクリックして、[ プロジェクト ] をクリックします。
  3. [ 新しいプロジェクト ] ダイアログする Visual C# プロジェクト で、Microsoft Office InfoPath プロジェクト フォルダー。
  4. [ 名前 ] ボックスで AttachmentEncoding 、入力を [OK] をクリックします。
  5. Microsoft Office プロジェクト ウィザードで [ 新しいフォーム テンプレートの作成 ] をクリックし、 [終了日]

    Microsoft Office プロジェクト ウィザードは AttachmentEncoding という名前が新しいの Visual Studio .NET 2003年プロジェクトを作成します。 InfoPath フォーム テンプレートも作成されます。 InfoPath フォーム テンプレートを AttachmentEncoding と呼びます。

Visual Studio .NET 2003年で、エンコーダー クラスを作成します。

  1. ソリューション エクスプローラーで、 AttachmentEncoding を右クリックして 追加 ] をポイントし、[ 新しい項目の追加 ] をクリックします。
  2. [新しい項目の追加 ] ダイアログ [ テンプレート ] ウィンドウの [ クラス [] ボックスに、 InfoPathAttachmentEncoder.cs を入力し、[ ファイルを開く </a0> をクリックします。
  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 を入力し、[ ファイルを開く </a0> をクリックします。
  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. [InfoPath 2003 で コントロール ] 作業ウィンドウ] で [ コントロールの挿入 ファイルの添付ファイル をクリックします。

    [InfoPath 2007 で コントロール ] 作業ウィンドウで [ ファイルと画像 ファイルの添付ファイル をクリックします。
  3. 添付ファイル コントロールを右クリックし、 [ファイルの添付ファイルのプロパティ を実行します。
  4. [ ファイルの添付ファイルのプロパティ ] ダイアログ ボックスで theAttachmentField フィールド名 ボックスに入力を [OK] をクリックします。
  5. [ コントロールを挿入する テキスト ボックス を [InfoPath 2003 で のコントロール ] 作業ウィンドウをクリックします。

    [ 標準 ] テキスト ボックス を [InfoPath 2007 で コントロール ] 作業ウィンドウをクリックします。
  6. テキスト ボックス コントロールを右クリックし、 テキスト ボックスのプロパティ を実行します。
  7. テキスト ボックスのプロパティ ] ダイアログボックスで、 フィールド名 ボックスに theAttachmentName を入力] の [ OK] をクリックします。

添付ファイル] を InfoPath フォームに追加します。

  1. [InfoPath 2003 で コントロール ] 作業ウィンドウ] で [ コントロールの挿入 ] ボタン をクリックします。

    [InfoPath 2007 で コントロール ] 作業ウィンドウで [ 標準 ] ボタン をクリックします。
  2. 新しい ボタン コントロール] を右クリックし、[ ボタンのプロパティ ] をクリックします。
  3. ボタンのプロパティ ] ダイアログ入力 添付 [ ラベル ] ボックスに、[ ID ] ボックスに 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. [InfoPath 2003 で コントロール ] 作業ウィンドウ] で [ コントロールの挿入 ] ボタン をクリックします。

    [InfoPath 2007 で コントロール ] 作業ウィンドウで [ 標準 ] ボタン をクリックします。
  3. 新しい ボタン コントロール] を右クリックし、[ ボタンのプロパティ ] をクリックします。
  4. ボタンのプロパティ ] ダイアログ入力 保存 [ ラベル ] ボックスに、[ ID ] ボックスに 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> ファイルを保存する場所にします。

InfoPath フォーム テンプレートが完全に信頼されていることを確認します。

このフォームをテストする前に、InfoPath フォーム テンプレートは完全に信頼されている </a0> をなければなりません。 使用して、次の方法のいずれか、InfoPath フォーム テンプレートが完全に信頼されていることを確認します。
  • Visual C# コードにのみアクセス許可を完全に信頼を付与するのにには、Framework 1. 1 設定の Microsoft .NET ユーティリティを使用します。
  • InfoPath ソフトウェアから RegForm ユーティリティを使用して、フォームを完全に信頼されたフォームを開発キット (SDK)。 これにより、Visual C# コードに完全な信頼のアクセス許可与えられます。
  • コード署名証明書が、フォーム テンプレート ファイル (.xsn) にデジタル署名してください。 コード署名証明書を使用して、フォーム テンプレート ファイルにデジタル署名するとユーザー フォームを開いたときに、フォームを信頼するように求められます。 これにより、完全に信頼できるフォーム。 したがって、完全な信頼のアクセス許可は、Visual C# コードに付与します。
  • 完全に信頼されたフォームをフォームには、 IPFullTrust マクロ InfoPath SDK からを使用します。 IPFullTrust マクロが自動的にフォーム テンプレートを登録するしと、 IPFullTrust マクロが自動化され、マニフェスト ファイル (.xsf) と、フォーム テンプレート ファイルに対して完全な信頼は、InfoPath プロジェクトで設定できます。

    インストール、およびマクロを使用して、次のマイクロソフト開発者向けネットワーク (MSDN) Web サイトを参照してくださいする方法の詳細については。
    http://msdn2.microsoft.com/en-us/library/aa202736(office.11).aspx (http://msdn2.microsoft.com/en-us/library/aa202736(office.11).aspx)
  • InfoPath での [外部オートメーションを使用して、 RegisterSolution メソッドを呼び出します。 通常、このメソッドにだけ使用フォーム開発の登録フォームは個々 のコンピューターだけ登録するため。 その他のフォーム、他のユーザーが自分のコンピューター上の他のフォーム登録する必要があります。 おは他のフォームのこのメソッドは勧めしません。 フォームを発行するとき、以前の方法のいずれ推奨します。
このフォームはフォームの開発中であるため最後のメソッドを使用できます。 これを行うには、AttachmentEncoding の InfoPath フォーム テンプレートを選択し、次の手順を実行します。
  1. [ ツール ] メニューのをクリックして フォーム オプション
  2. [ セキュリティ ] タブをクリックします。
  3. [ 自動 (推奨) フォームのデザインに基づいてセキュリティ レベルを決定 する </a0>] チェック ボックスをオフします。

    メモ InfoPath は完全な信頼のアクセス許可が必要なビジネス ロジックを自動的に検出できません。 したがって、完全な信頼のアクセス許可を与える明示的に必要があります。
  4. [ 完全信頼 ]、[ OK] をクリック します。
  5. AttachmentEncoding の InfoPath フォーム テンプレートを閉じます。 変更を保存するメッセージが表示される場合、 [はい] </a0> をクリックします。

    メモ Visual Studio .NET 2003年プロジェクトを閉じないでください。
  6. Visual Studio .NET 2003年でソリューション エクスプローラーで Manifest.xsf ファイルをダブルクリックします。 Manifest.xsf ファイルが開きます。
  7. ルート ノードで、 publishUrl 属性を探します。 publishUrl 属性と、 publishUrl 属性の値削除します。
  8. ファイルを保存して閉じる、Manifest.xsf と変更、します。
  9. 開始 ] をクリックして 実行 ] をクリックして、 メモ帳 と入力して [OK] をクリックします。
  10. 空白のテキスト ファイルに次のコードを追加します。
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    メモ このコードでは、<project_folder_url> プロジェクト フォルダー内の Manifest.xsf ファイルのパスを使用します。 Manifest.xsf ファイルのパスをエスケープしてください。 円すべて単一記号 (\) パスでは 2 つの円記号 (\) に置き換えられる必要があります。
  11. コンピューターの Manifest.xsf ファイルを Register.js ファイルとして保存します。
  12. RegisterSolution メソッドを呼び出す、 Register.js ファイルを作成したをダブルクリックしています。

フォームをテストします。

  1. AttachmentEncoding Visual Studio .NET 2003年プロジェクトで、 デバッグ にメニュー 開始 ] をクリックします。 InfoPath フォームがプレビュー モードで起動します。
  2. InfoPath フォームで、[、テキスト ボックスに添付しているファイルのパスを入力し、[ 添付 ] をクリックします。

    メモ 添付ファイル コントロール、ファイルが正しくエンコードされていることを確認するダブルクリックします。
  3. 保存 をクリックします。 InfoPath フォームへの [ 保存 ] </a0> ボタンの追加] セクションで指定したパスを探します。
  4. テストの終了するには プレビューを閉じる をクリックします。

関連情報

ファイルの添付ファイルのヘッダー形式の詳細についてには次 MSDN Web サイトを参照してください。
InfoPath 2003 でファイルの添付
http://msdn2.microsoft.com/en-us/library/aa168351(office.11).aspx (http://msdn2.microsoft.com/en-us/library/aa168351(office.11).aspx)

この資料は以下の製品について記述したものです。
  • Microsoft Office InfoPath 2007
  • Microsoft Office InfoPath 2003, Service Pack 1 (SP1)
キーワード:?
kbmt kbcode kbscript kbsample kbxml kbprogramming kbhowto KB892730 KbMtja
機械翻訳機械翻訳
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:892730? (http://support.microsoft.com/kb/892730/en-us/ )
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
 

サポート技術情報の翻訳

 

Related Support Centers