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

概要

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

はじめに

この資料では、エンコードして、InfoPath 2003 では、Microsoft Visual C# を使用して、プログラムで添付ファイルをデコードする方法について説明します。InfoPath 2010 では、または InfoPath 2007 では、これを行う方法の詳細については、次の web ページを参照してください:をエンコードする方法と、Visual C# または InfoPath 2007 で InfoPath 2010 を使用してプログラムを使用して添付ファイルをデコードする方法です。

詳細

マイクロソフトでは解説することのみを目的としてプログラミング例を提供しています。暗示あるいは明示していることに対しての保証はしておりません。ここで言う保証とは、特定の目的に対する商品性や適合性の暗示的保証を含んでいますが、それに限定されるわけではありません。この資料では、例示されているプログラミング言語およびプロシージャの作成やデバッグに使用するツールにお客様が精通していることを前提としています。マイクロソフトのサポート エンジニアは、特定のプロシージャの機能を説明することができますが、機能の追加またはお客様固有の要件を満たすようにプロシージャを作成するこれらの例は変更されません。

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

  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
    ] ボックスおよび [開く] をクリックします。
  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を入力し、し、[ OK] をクリックします。
  5. [コントロール] 作業ウィンドウで、[テキスト ボックス] をクリックします
    コントロールを挿入します。
  6. テキスト ボックスコントロールを右クリックし、テキスト ボックスのプロパティ] をクリックします。
  7. テキスト ボックスのプロパティ] ダイアログ ボックスで、[フィールド名] ボックスにtheAttachmentNameを入力し、し、[ OK] をクリックします。

InfoPath フォームに、[添付] ボタンを追加します。

  1. [コントロール] 作業ウィンドウの下のボタンをクリックします
    コントロールを挿入します。
  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. [コントロール] 作業ウィンドウの下のボタンをクリックします
    コントロールを挿入します。
  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>");
    }

    注: このコードでは、ファイルを保存する場所を指定して< ファイルの保存先のパス >を交換してください。

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

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

    インストールして、マクロを使用する方法の詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
  • RegisterSolutionメソッドを呼び出すには、InfoPath では外部オートメーションを使用します。通常、登録されたフォームは、個々 のコンピューターにのみ登録されるため、フォームの開発のこのメソッドは使用のみ。その他のフォームでは、他のユーザーは、自分のコンピューター上の追加のフォームを登録しなければなりません。追加フォームのこのメソッドは勧めしません。フォームを発行するときに上記の方法のいずれかをお勧めします。
このフォームはフォームの開発中であるために、最後のメソッドを使用できます。これを行うには、AttachmentEncoding の InfoPath フォーム テンプレートを見つけて、これらの手順を実行します. します。
  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属性と、この属性の値を削除します。
  8. 変更内容を保存し、Manifest.xsf ファイルを閉じます。
  9. [スタート] ボタン、[実行] をクリックして、メモ帳を入力し、
    OK.
  10. 空白のテキスト ファイルに次のコードを追加します。
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite");

    注: このコードでは、次のように置換します。
    Manifest.xsf ファイルで、プロジェクト フォルダーのパスを使用して< project_folder_url >をします。Manifest.xsf ファイルのパスをエスケープすることを忘れないでください。2 つの円記号 (\) は、すべて 1 つのバック スラッシュ (\) のパスを置き換える必要があります。
  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 でファイルを添付します。
http://msdn2.microsoft.com/en-us/library/aa168351(office.11).aspx
プロパティ

文書番号:892730 - 最終更新日: 2017/02/02 - リビジョン: 1

Microsoft Office InfoPath 2003

フィードバック