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

文書翻訳 文書翻訳
文書番号: 892730
すべて展開する | すべて折りたたむ

目次

概要

InfoPath 2007 の Microsoft Office または Microsoft Office InfoPath 2003 Service Pack 1 (SP1) では、使用することができます、 添付ファイル InfoPath フォーム テンプレートにファイルを添付するコントロール。特定の状況では、エンコードして、関連付けられているファイルのデコードに必要な可能性があります、 添付ファイル コントロール。この例では、Microsoft Visual C# を作成する使ってできます、 エンコーダー クラスとは デコーダ クラスです。使用することができます、 エンコーダー クラスとは デコーダ エンコード ファイルをデコードしてクラス添付ファイル。

はじめに

ここでは、エンコード、および Microsoft Visual C# InfoPath 2003 を使用して、プログラムで添付ファイルをデコードする方法を紹介します。InfoPath 2010 でまたは InfoPath 2007 では、この操作を行う方法の詳細については、次の web ページを参照してください。 エンコードおよび Visual C# では、InfoPath 2010 または InfoPath 2007 を使用して、プログラムで添付ファイルをデコードする方法.

詳細

Microsoft プログラミング例としてを提供するだけ、黙示の保証もないです。これが含まれます黙示の商品性または適合性の特定するには目的。この資料では、プログラミングに精通している前提としています例示されている言語とツールを作成するために使用プロシージャをデバッグするにはマイクロソフト サポート エンジニアができますヘルプ説明、特定のプロシージャの機能がこれら変更はありません追加機能を提供しますまたは、対応するプロシージャを作成するには、例として、。要件を特定します。

Visual 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 で、 ID ボックスをクリックし.フォームのコードを編集します。.
  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 フォームを切り替えるテンプレートです。
  2. で、 コントロール作業ウィンドウで、クリックしてくださいボタン[コントロールを挿入します。.
  3. 新しい右クリックします。 ボタン コントロールは、クリックして、 [ボタンのプロパティ.
  4. で、 [ボタンのプロパティ ダイアログ ボックス、入力保存 で、 ラベル ボックス、入力btnSave で、 ID ボックスをクリックし.フォームのコードを編集します。.
  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 構成ユーティリティ完全信頼のアクセス許可、Visual C# コードだけに付与します。
  • InfoPath ソフトウェアからの RegForm ユーティリティを使用します。開発キット (フォームを完全に信頼されたフォームに SDK)。これは、全を許可します。Visual C# コードへのアクセス許可を信頼します。
  • コード署名証明書を使用して、フォームにデジタル署名するのにはテンプレート ファイル (.xsn)。デジタル署名を追加するには、コード署名証明書を使用すると、フォーム テンプレート ファイルをユーザーが開くと、フォームを信頼するように要求されます、フォーム。完全に信頼できるフォームよう次のようになります。したがって、完全信頼のアクセス許可とはVisual C# コードに付与します。
  • 使用、 IPFullTrust マクロから、完全に信頼されたフォームには、InfoPath SDKフォーム。、 IPFullTrust マニフェスト ファイル (.xsf) と、フォームを設定するマクロを自動化します。InfoPath プロジェクトのテンプレート ファイルの完全な信頼をし、 IPFullTrust マクロは、フォーム テンプレートを自動的に登録します。

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

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

    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></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 フォームにボタン"セクション。
  4. テストを終了するをクリックします。 閉じるプレビュー.

関連情報

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

プロパティ

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

フィードバック

 

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