Způsob kódování a dekódování souboru přílohy programově pomocí aplikace Visual C# v aplikaci InfoPath 2003

Souhrn

V aplikaci Microsoft Office InfoPath 2007 nebo Microsoft Office InfoPath 2003 Service Pack 1 (SP1) můžete použít ovládací prvek Soubor jako příloha k připojení souboru k šabloně formuláře aplikace InfoPath. Za určitých okolností můžete chtít kódování a dekódování klepněte na soubor, který se připojuje k ovládacímu prvku Soubor jako příloha . V takovém případě můžete Microsoft Visual C# vytvořit třída kodér a dekodér třída. Potom můžete použít kodér třída a dekodér třída pro kódování a dekódování souboru přílohy.

ÚVOD

Tento článek uvádí způsob kódování a dekódování souboru přílohy programově pomocí jazyka Microsoft Visual C# v aplikaci InfoPath 2003. Další informace o tomto postupu v aplikaci InfoPath 2010 nebo aplikace InfoPath 2007, naleznete na následující webové stránce: kódování a dekódování souboru přílohy programově pomocí aplikace Visual C# v aplikaci InfoPath 2010 nebo aplikace InfoPath 2007 .

Další informace

Společnost Microsoft poskytuje ukázky programování pouze pro ilustraci bez žádné záruky výslovně uvedené nebo odvozené. To zahrnuje, ale není omezen pouze na předpokládané záruky obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že jste obeznámeni s programovacím jazykem, který je předmětem ukázky a s nástroji, které slouží k vytvoření a ladění skriptu. Pracovníci podpory společnosti Microsoft mohou pomoci vysvětlit funkce určitého postupu, nemohou však následující příklady rozšířit o další funkce nebo vytvářet postupy podle vašich konkrétních požadavků.

Vytvořit projekt Visual C# aplikace InfoPath 2003

  1. Spusťte aplikaci Visual Studio .NET 2003.
  2. V nabídce soubor klepněte na tlačítko
    Novýa potom klikněte na projekt.
  3. V dialogovém okně Nový projekt klepněte na tlačítko
    Ve složce aplikace Microsoft Office InfoPath projekty Visual C# projekty .
  4. Do pole název zadejte
    AttachmentEncodinga potom klepněte na tlačítko
    OK.
  5. V průvodce Microsoft Office Project klepněte na tlačítko
    Vytvořit novou šablonu formulářea potom klepněte na tlačítko
    Dokončit.

    Průvodce Microsoft Office Project vytvoří nový projekt Visual Studio .NET 2003 s názvem AttachmentEncoding. Šablonu formuláře aplikace InfoPath je také vytvořen. Šablonu formuláře aplikace InfoPath je s názvem AttachmentEncoding.

V aplikaci Visual Studio .NET 2003 vytvořit třídu Encoder

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši
    AttachmentEncoding, přejděte na příkaz Přidata potom klepněte na tlačítko Přidat novou položku.
  2. V dialogovém okně Přidat novou položku klepněte na tlačítko
    Zadejte třídu , v podokně šablony
    InfoPathAttachmentEncoder.cs v
    Název a klepněte na tlačítko Otevřít.
  3. Veškerý kód v souboru InfoPathAttachmentEncoder.cs nahraďte následující kód.
    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());
    }
    }
    }

Vytvoření třídy dekodér v aplikaci Visual Studio .NET 2003

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši
    AttachmentEncoding, přejděte na příkaz Přidata potom klepněte na tlačítko Přidat novou položku.
  2. V dialogovém okně Přidat novou položku klepněte na tlačítko
    Zadejte třídu , v podokně šablony
    InfoPathAttachmentDecoder.cs v
    Název a klepněte na tlačítko Otevřít.
  3. Nahraďte veškerý kód InfoPathAttachmentDecoder.cs soubor s následujícím kódem.
    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; }
    }
    }
    }


Přidat ovládací prvek Soubor jako příloha a ovládací prvek textové pole do formuláře aplikace InfoPath

  1. V šabloně formuláře aplikace AttachmentEncoding InfoPath klepněte na ovládací prvky v podokno úloh Navrhnout úkoly .
  2. V podokno úloh ovládací prvky klepněte na tlačítko Soubor jako příloha v
    Vložit ovládací prvky.
  3. Klepněte pravým tlačítkem na ovládací prvek Soubor jako příloha a potom klepněte na tlačítko Vlastnosti přiloženého souboru.
  4. V dialogovém okně Vlastnosti přiloženého souboru theAttachmentField zadejte do pole Název pole a potom klepněte na tlačítko OK.
  5. V podokno úloh ovládací prvky klepněte v části Textové pole
    Vložit ovládací prvky.
  6. Klepněte pravým tlačítkem myši ovládací prvek Textové pole a potom klepněte na tlačítko Vlastnosti textového pole.
  7. V dialogovém okně Vlastnosti textového pole zadejte theAttachmentName v rozevíracím seznamu Název pole a potom klepněte na tlačítko OK.

Přidání tlačítka připojit k formuláři aplikace InfoPath

  1. V podokno úloh ovládací prvky klepněte na tlačítko ve skupinovém rámečku
    Vložit ovládací prvky.
  2. Klepněte pravým tlačítkem myši na nové tlačítko a poté klepněte na Tlačítko Vlastnosti.
  3. V dialogovém okně Vlastnosti tlačítka zadejte
    Připojit do pole Popisek zadejte
    btnAttach v ID pole a pak klepněte na
    Upravit kód formuláře.
  4. Přidejte následující kód do metody 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();
    }

Přidání tlačítka Uložit do formuláře aplikace InfoPath

  1. Přepněte se do šablony formuláře aplikace AttachmentEncoding InfoPath.
  2. V podokno úloh ovládací prvky klepněte na tlačítko ve skupinovém rámečku
    Vložit ovládací prvky.
  3. Klepněte pravým tlačítkem myši na nové tlačítko a poté klepněte na Tlačítko Vlastnosti.
  4. V dialogovém okně Vlastnosti tlačítka zadejte
    Uložit do pole Popisek zadejte
    btnSave v ID pole a pak klepněte na
    Upravit kód formuláře.
  5. Přidejte následující kód do metody 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>");
    }

    Poznámka: V tomto kódu nahraďte < cesta k souboru > umístění, kam chcete soubor uložit.

Ujistěte se, že je plně důvěryhodné šablony formuláře aplikace InfoPath

Chcete-li otestovat tento formulář, musí být plně důvěryhodné šablony formuláře aplikace InfoPath. Abyste se ujistili, že je plně důvěryhodné šablony formuláře aplikace InfoPath můžete použít jednu z následujících metod:
  • Pomocí nástroje Microsoft rozhraní.NET Framework 1.1 Configuration udělit oprávnění Úplná důvěryhodnost pouze pro kód jazyka Visual C#.
  • Chcete-li formulář plně důvěryhodný formulář pomocí nástroje RegForm z aplikace InfoPath Software Development Kit (SDK). Tím udělíte oprávnění Úplná důvěryhodnost kódu Visual C#.
  • Použijte kód podpisový certifikát k podepsání souboru šablony formuláře (XSN). Pokud soubor šablony formuláře digitálně podepsat pomocí certifikátu podepisování kódu, uživatelé vyzváni k důvěryhodné formuláře při otevření formuláře. Tím plně důvěryhodné formuláře. Proto jsou přidělena oprávnění Úplná důvěryhodnost kódu Visual C#.
  • Chcete-li formulář plně důvěryhodný formulář Použíjte IPFullTrust makra z SDK pro aplikaci InfoPath. IPFullTrust makro automatizuje nastavení souboru manifestu (XSF) a soubor šablony formuláře v aplikaci InfoPath projektu pro úplný vztah důvěryhodnosti a pak IPFullTrust makra automaticky zaregistruje šablonu formuláře.

    Další informace o tom, jak nainstalovat a používat makra naleznete následujícím webu Microsoft Developer Network (MSDN):
  • Použijte externí automatizaci v aplikaci InfoPath k volání metody RegisterSolution . Obvykle tato metoda slouží pouze pro vývoj formulářů protože registrované formuláře zaregistruje pouze pro jednotlivé počítače. Pro všechny další formuláře musí registrovat ostatním uživatelům další formuláře na vlastním počítači. Společnost Microsoft nedoporučuje tuto metodu pro další formuláře. Při publikování formuláře doporučujeme některou z výše uvedených metod.
Protože tento formulář je ve vývoji formuláře, můžete použít metodu poslední. Chcete-li to provést, vyhledejte šablonu formuláře aplikace AttachmentEncoding InfoPath a pak postupujte takto:
  1. V nabídce Nástroje na položku Možnosti formuláře.
  2. Klepněte na kartu zabezpečení .
  3. Klepnutím zrušte zaškrtnutí políčka automaticky určit úroveň zabezpečení podle návrhu formuláře (doporučeno) .

    Poznámka: Aplikace InfoPath nelze automaticky rozpoznat obchodní logiky, která vyžaduje oprávnění Úplná důvěryhodnost. Proto je nutné explicitně udělit oprávnění plné důvěryhodnosti.
  4. Klepněte na tlačítko Úplná důvěryhodnosta potom klepněte na tlačítko
    OK.
  5. Zavřete šablonu formuláře aplikace AttachmentEncoding InfoPath. Pokud se zobrazí výzva k uložení změn, klepněte na tlačítko Ano.

    Poznámka: Nezavírejte projektu Visual Studio .NET 2003.
  6. V aplikaci Visual Studio .NET 2003, poklepejte
    Soubor manifest.xsf v Průzkumníku řešení. Otevře se soubor Manifest.xsf.
  7. V kořenovém uzlu vyhledejte atribut publishUrl . Odeberte publishUrl atribut a hodnota atributu publishUrl .
  8. Uložte změny a zavřete soubor Manifest.xsf.
  9. Klepněte na tlačítko Start, klepněte na příkaz Spustit, zadejte Poznámkový bloka potom klepněte na tlačítko
    OK.
  10. Přidejte následující kód do prázdného textového souboru.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite");

    Poznámka: V tomto kódu nahradit
    < project_folder_url > cestou k souboru Manifest.xsf ve složce projektu. Nezapomeňte únikové cesty souboru Manifest.xsf. Všechny jeden zpětná lomítka (\) v cestě musí být nahrazeny dvěma zpětnými lomítky (\).
  11. Uložte soubor Manifest.xsf v počítači jako soubor Register.js.
  12. Volání metody RegisterSolution , poklepejte Register.js soubor, který jste vytvořili.

Testování formuláře

  1. V projektu AttachmentEncoding Visual Studio .NET 2003 klepněte na tlačítko Start v nabídce ladění . Formulář aplikace InfoPath spustí v režimu náhledu.
  2. Ve formuláři aplikace InfoPath zadejte cestu souboru, který chcete připojit do textového pole a potom klepněte na tlačítko
    Připojit.

    Poznámka: Poklepejte na ovládací prvek Soubor jako příloha k ověření, že je správně kódovaný soubor.
  3. Klepněte na tlačítko Uložit. Vyhledejte cestu, kterou jste uvedli v části "Přidání tlačítka Uložit do formuláře aplikace InfoPath".
  4. Zkoušku ukončíte klepnutím na tlačítko Zavřít náhled.

Odkazy

Další informace o formátu záhlaví souboru přílohy naleznete na následujícím webu MSDN:
Připojování souborů v aplikaci InfoPath 2003
http://msdn2.microsoft.com/en-us/library/aa168351(office.11).aspx
Vlastnosti

ID článku: 892730 - Poslední kontrola: 17. 2. 2017 - Revize: 2

Microsoft Office InfoPath 2003

Váš názor