Jak kódovat a dekódovat přílohu souboru prostřednictvím kódu programu pomocí jazyka Visual C# v aplikaci InfoPath 2003

Souhrn

V aplikaci Microsoft Office InfoPath 2007 nebo Microsoft Office InfoPath 2003 Service Pack 1 (SP1) můžete pomocí ovládacího prvku Příloha souboru připojit soubor k šabloně formuláře aplikace InfoPath. Za určitých okolností můžete chtít zakódovat a potom dekódovat soubor, který je připojen k ovládacímu prvku Příloha souboru . V tomto případě můžete použít Microsoft Visual C# k vytvoření třídy Encoder a třídy Decoder. Potom můžete použít Encoder třídy a Decoder třídy kódování a dekódování souboru přílohy.

Úvod

Tento článek popisuje, jak kódovat a dekódovat přílohu souboru prostřednictvím kódu programu pomocí jazyka Microsoft Visual C# v aplikaci InfoPath 2003. Informace o tom, jak to udělat v infopathu 2010 nebo InfoPathu 2007, najdete na následující webové stránce: Jak kódovat a dekódovat přílohu souboru programově pomocí jazyka Visual C# v InfoPathu 2010 nebo InfoPathu 2007 .

Další informace

Společnost Microsoft poskytuje ukázky programování pouze pro ilustraci, bez žádné záruky výslovně uvedené nebo odvozené, včetně, bez omezení, odvozených záruk vztahujících se k obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že uživatel je obeznámen s programovacím jazykem, který je předmětem ukázky, a s nástroji použitými pro vytvoření a ladění skriptu. Pracovníci technické podpory společnosti Microsoft mohou vysvětlit funkce určitého postupu, nemohou však následující příklady rozšířit o další funkce nebo konstrukce podle konkrétních požadavků uživatele.

Vytvoření projektu Aplikace Visual C# InfoPath 2003

  1. Spusťte microsoft Visual Studio .NET 2003.

  2. V nabídce Soubor klikněte na Nový a potom klikněte na Project.

  3. V dialogovém okně Nový projekt klikněte ve složce Microsoft Office InfoPath Projects na projekty Visual C# .

  4. Do pole Název zadejte AttachmentEncoding a potom klikněte na OK.

  5. V Průvodci microsoft Office Project klepněte na tlačítko Vytvořit novou šablonu formuláře a potom klepněte na tlačítko Dokončit.

    Průvodce microsoft Office Project vytvoří nový projekt Visual Studio .NET 2003 s názvem AttachmentEncoding. Vytvoří se také šablona formuláře aplikace InfoPath. Šablona formuláře aplikace InfoPath má název AttachmentEncoding.

Vytvoření třídy kodéru v sadě Visual Studio .NET 2003

  1. V Průzkumník řešení klikněte pravým tlačítkem na AttachmentEncoding, přejděte na Přidat a potom klikněte na Přidat novou položku.
  2. V dialogovém okně Přidat novou položku klikněte v podokně Šablona na položku Třída, do pole Název zadejte InfoPathAttachmentEncoder.cs a klikněte na tlačítko Otevřít.
  3. Nahraďte veškerý kód v souboru InfoPathAttachmentEncoder.cs následujícím kódem.
    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 sadě Visual Studio .NET 2003

  1. V Průzkumník řešení klikněte pravým tlačítkem na AttachmentEncoding, přejděte na Přidat a potom klikněte na Přidat novou položku.
  2. V dialogovém okně Přidat novou položku klikněte v podokně Šablona na položku Třída, do pole Název zadejte InfoPathAttachmentDecoder.cs a potom klikněte na tlačítko Otevřít.
  3. Nahraďte veškerý kód v souboru InfoPathAttachmentDecoder.cs 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řidání ovládacího prvku Soubor jako přílohy a ovládacího prvku Textové pole do formuláře aplikace InfoPath

  1. V šabloně formuláře AttachmentEncoding InfoPath klikněte v podokně úloh Úkoly návrhu na ovládací prvky.
  2. V podokně úloh Ovládací prvky klikněte v části Vložit ovládací prvky na Soubor s přílohou.
  3. Klikněte pravým tlačítkem myši na ovládací prvek Soubor jako příloha a potom klikněte na příkaz Vlastnosti přílohy souboru.
  4. V dialogovém okně Vlastnosti přílohy souboru zadejteAttachmentField do pole Název pole a potom klepněte na tlačítko OK.
  5. V podokně úloh Ovládací prvky klikněte v části Vložit ovládací prvky na Textové pole.
  6. Klikněte pravým tlačítkem myši na ovládací prvek Textové pole a potom klikněte na příkaz Vlastnosti textového pole.
  7. V dialogovém okně Vlastnosti textového pole zadejteattachmentName do pole Název pole a potom klepněte na tlačítko OK.

Přidání tlačítka Připojit do formuláře aplikace InfoPath

  1. V podokně úloh Ovládací prvky klikněte v části Vložit ovládací prvky na tlačítko.
  2. Klikněte pravým tlačítkem myši na nový ovládací prvek Tlačítko a potom klikněte na příkaz Vlastnosti tlačítka.
  3. V dialogovém okně Vlastnosti tlačítka zadejte Připojit do pole Popisek , do pole ID zadejte btnAttach a klepněte na tlačítko Upravit kód formuláře.
  4. Do metody btnAttach_OnClick přidejte následující kód.
    //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 do šablony formuláře AttachmentEncoding InfoPath.
  2. V podokně úloh Ovládací prvky klikněte v části Vložit ovládací prvky na tlačítko.
  3. Klikněte pravým tlačítkem myši na nový ovládací prvek Tlačítko a potom klikněte na příkaz Vlastnosti tlačítka.
  4. V dialogovém okně Vlastnosti tlačítka zadejte Uložit do pole Popisek , do pole ID zadejte btnSave a potom klepněte na tlačítko Upravit kód formuláře.
  5. Do metody btnSave _OnClick přidejte následující kód.
    //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 umístěním, kam chcete soubor uložit.

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

Než budete moci tento formulář otestovat, musí být šablona formuláře aplikace InfoPath plně důvěryhodná. Pomocí jedné z následujících metod se ujistěte, že je šablona formuláře aplikace InfoPath plně důvěryhodná:

  • Pomocí konfiguračního nástroje Microsoft .NET Framework 1.1 udělte oprávnění úplné důvěryhodnosti pouze kódu Visual C#.

  • Pomocí nástroje RegForm ze sady InfoPath Software Development Kit (SDK) vytvořte formulář jako plně důvěryhodný formulář. Tím se vašemu kódu Visual C# udělí oprávnění úplné důvěryhodnosti.

  • Pomocí certifikátu pro podpis kódu digitálně podepište soubor šablony formuláře (.xsn). Pokud k digitálnímu podepsání souboru šablony formuláře použijete certifikát pro podpis kódu, zobrazí se uživatelům při otevření formuláře výzva, aby mu důvěřovali. Díky tomu je formulář plně důvěryhodný. Proto jsou udělena oprávnění úplné důvěryhodnosti kódu Visual C#.

  • Pomocí makra IPFullTrust ze sady InfoPath SDK vytvořte formulář jako plně důvěryhodný formulář. Makro IPFullTrust automatizuje nastavení souboru manifestu (.xsf) a souboru šablony formuláře v projektu InfoPathu pro úplný vztah důvěryhodnosti a potom makro IPFullTrust automaticky zaregistruje šablonu formuláře.

    Další informace o instalaci a použití makra naleznete na následujícím webu Microsoft Developer Network (MSDN):

    https://msdn.microsoft.com/en-us/library/aa202736(office.11).aspx

  • K volání metody RegisterSolution použijte externí automatizaci v InfoPathu. Tato metoda se obvykle používá pouze pro vývoj formulářů, protože zaregistrovaný formulář registruje pouze pro jednotlivé počítače. Pro všechny další formuláře musí ostatní uživatelé zaregistrovat další formuláře na svých počítačích. Tuto metodu nedoporučujeme pro další formuláře. Při publikování formuláře doporučujeme některou z předchozích metod.

Vzhledem k tomu, že tento formulář je ve vývoji formulářů, můžete použít poslední metodu. Chcete-li to provést, vyhledejte šablonu formuláře AttachmentEncoding InfoPath a potom postupujte takto:

  1. V nabídce Nástroje klepněte na příkaz Možnosti formuláře.

  2. Klikněte na kartu Zabezpečení.

  3. Kliknutím zrušte zaškrtnutí políčka Automaticky určit úroveň zabezpečení na základě návrhu formuláře (doporučeno).

    Poznámka Aplikace InfoPath nemůže automaticky rozpoznat obchodní logiku, která vyžaduje oprávnění Úplná důvěryhodnost. Proto musíte explicitně udělit oprávnění úplné důvěryhodnosti.

  4. Klepněte na tlačítko Úplný vztah důvěryhodnosti a potom klepněte na tlačítko OK.

  5. Zavřete šablonu formuláře AttachmentEncoding InfoPath. Pokud se zobrazí výzva k uložení změn, klikněte na tlačítko Ano.

    Poznámka Nezavírají visual studio .NET 2003 projektu.

  6. V sadě Visual Studio .NET 2003 dvakrát klikněte na soubor Manifest.xsf v Průzkumník řešení. Otevře se soubor Manifest.xsf.

  7. V kořenovém uzlu vyhledejte atribut publishUrl. Odeberte atribut publishUrl a hodnotu 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ý blok a klepněte na tlačítko OK.

  10. Do prázdného textového souboru přidejte následující kód.

    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    

    Poznámka V tomto kódu nahraďte project_folder_url cestou k souboru Manifest.xsf ve složce projektu. Nezapomeňte uvozit cestu k souboru Manifest.xsf. Všechna jednotlivá zpětná lomítka (\) v cestě musí být nahrazena dvěma zpětnými lomítky (\\).

  11. Uložte soubor Manifest.xsf do počítače jako soubor Register.js.

  12. Chcete-li volat metodu RegisterSolution, dvakrát klikněte na souborRegister.js , který jste vytvořili.

Testování formuláře

  1. V AttachmentEncoding Visual Studio .NET 2003 projektu, klepněte na tlačítko Start v nabídce Ladění . Tím se spustí formulář aplikace InfoPath v režimu náhledu.

  2. Ve formuláři Aplikace InfoPath zadejte cestu k souboru, který chcete připojit do textového pole, a klikněte na tlačítko Připojit.

    Poznámka Poklikejte na ovládací prvek Soubor jako příloha a ověřte, že je soubor správně zakódovaný.

  3. Klikněte na Uložit. Vyhledejte cestu, kterou jste zadali v části Přidat tlačítko Uložit do formuláře aplikace InfoPath.

  4. Pokud chcete test ukončit, klikněte na Zavřít náhled.

Odkazy

Další informace o formátu záhlaví přílohy souboru naleznete na následujícím webu MSDN:

Připojení souborů v aplikaci InfoPath 2003 https://msdn.microsoft.com/en-us/library/aa168351(office.11).aspx