Jak programowo kodować i dekodować załącznik pliku przy użyciu języka Visual C# w programie InfoPath 2003

Podsumowanie

W programie Microsoft Office InfoPath 2007 lub Microsoft Office InfoPath 2003 z dodatkiem Service Pack 1 (SP1) możesz użyć kontrolki Załącznik do pliku , aby dołączyć plik do szablonu formularza programu InfoPath. W określonych okolicznościach możesz chcieć zakodować, a następnie zdekodować plik dołączony do kontrolki Załącznik do pliku . W takim przypadku można użyć programu Microsoft Visual C# do utworzenia klasy Koder i klasy Dekoder. Następnie można użyć klasy Koder i klasy Dekoder do zakodowania i dekodowania załącznika pliku.

Wprowadzenie

W tym artykule przedstawiono sposób programowego kodowania i dekodowania załącznika pliku przy użyciu programu Microsoft Visual C# w programie InfoPath 2003. Aby uzyskać informacje na temat tego, jak to zrobić w programie InfoPath 2010 lub InfoPath 2007, zobacz następującą stronę sieci Web: Jak kodować i dekodować załącznik pliku programowo przy użyciu programu Visual C# w programie InfoPath 2010 lub w programie InfoPath 2007 .

Więcej informacji

Firma Microsoft podaje przykłady programowania tylko dla celów ilustracyjnych, nie udzielając żadnej rękojmi, wyrażonej wprost ani dorozumianej, w tym także, ale nie tylko, dorozumianej rękojmi co do przydatności handlowej lub do określonych celów. W tym artykule zakłada się, że czytelnik zna demonstrowany język programowania oraz narzędzia używane do tworzenia i debugowania procedur. Wykwalifikowani pracownicy pomocy technicznej firmy Microsoft mogą pomóc w wyjaśnieniu, jak działa określona procedura, ale nie będą modyfikować tych przykładów ani dodawać żadnych funkcji i konstruować nowych procedur w celu dostosowania ich do określonych potrzeb użytkownika.

Tworzenie projektu programu InfoPath 2003 w języku Visual C#

  1. Uruchom program Microsoft Visual Studio .NET 2003.

  2. W menu Plik kliknij pozycję Nowy, a następnie kliknij pozycję Projekt.

  3. W oknie dialogowym Nowy projekt kliknij pozycję Projekty Visual C# w folderze Microsoft Office InfoPath Projects.

  4. W polu Nazwa wpisz AttachmentEncoding, a następnie kliknij przycisk OK.

  5. W Kreatorze projektu pakietu Microsoft Office kliknij pozycję Utwórz nowy szablon formularza, a następnie kliknij przycisk Zakończ.

    Kreator projektu pakietu Microsoft Office tworzy nowy projekt programu Visual Studio .NET 2003 o nazwie AttachmentEncoding. Tworzony jest również szablon formularza programu InfoPath. Szablon formularza programu InfoPath nosi nazwę AttachmentEncoding.

Tworzenie klasy Koder w programie Visual Studio .NET 2003

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję AttachmentEncoding, wskaż polecenie Dodaj, a następnie kliknij pozycję Dodaj nowy element.
  2. W oknie dialogowym Dodawanie nowego elementu kliknij pozycję Klasa w okienku Szablon , wpisz InfoPathAttachmentEncoder.cs w polu Nazwa , a następnie kliknij przycisk Otwórz.
  3. Zastąp cały kod w pliku InfoPathAttachmentEncoder.cs następującym kodem.
    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());
    }
    }
    }
    

Tworzenie klasy dekodera w programie Visual Studio .NET 2003

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję AttachmentEncoding, wskaż polecenie Dodaj, a następnie kliknij pozycję Dodaj nowy element.
  2. W oknie dialogowym Dodawanie nowego elementu kliknij pozycję Klasa w okienku Szablon , wpisz InfoPathAttachmentDecoder.cs w polu Nazwa , a następnie kliknij przycisk Otwórz.
  3. Zastąp cały kod w pliku InfoPathAttachmentDecoder.cs następującym kodem.
    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; }
    }
    }
    }
    
    

Dodawanie kontrolki Załącznik pliku i kontrolki Pole tekstowe do formularza programu InfoPath

  1. W szablonie formularza AttachmentEncoding InfoPath kliknij pozycję Kontrolki w okienku zadań Zadania projektowe .
  2. W okienku zadań Kontrolki kliknij pozycję Załącznik pliku w obszarze Wstaw kontrolki.
  3. Kliknij prawym przyciskiem myszy kontrolkę Załącznik pliku , a następnie kliknij pozycję Właściwości załącznika pliku.
  4. W oknie dialogowym Właściwości załącznika pliku wpisz poleAttachmentField w polu Nazwa pola , a następnie kliknij przycisk OK.
  5. W okienku zadań Kontrolki kliknij pozycję Pole tekstowe w obszarze Wstaw kontrolki.
  6. Kliknij prawym przyciskiem myszy kontrolkę Pole tekstowe , a następnie kliknij pozycję Właściwości pola tekstowego.
  7. W oknie dialogowym Właściwości pola tekstowego wpisz ciągAttachmentName w polu Nazwa pola , a następnie kliknij przycisk OK.

Dodawanie przycisku Dołącz do formularza programu InfoPath

  1. W okienku zadań Kontrolki kliknij przycisk w obszarze Wstaw kontrolki.
  2. Kliknij prawym przyciskiem myszy nową kontrolkę Przycisk , a następnie kliknij pozycję Właściwości przycisku.
  3. W oknie dialogowym Właściwości przycisku wpisz Attach w polu Etykieta , wpisz btnAttach w polu Identyfikator , a następnie kliknij przycisk Edytuj kod formularza.
  4. Dodaj następujący kod 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();
    }
    
    

Dodawanie przycisku Zapisz do formularza programu InfoPath

  1. Przejdź do szablonu formularza AttachmentEncoding InfoPath.
  2. W okienku zadań Kontrolki kliknij przycisk w obszarze Wstaw kontrolki.
  3. Kliknij prawym przyciskiem myszy nową kontrolkę Przycisk , a następnie kliknij pozycję Właściwości przycisku.
  4. W oknie dialogowym Właściwości przycisku wpisz Zapisz w polu Etykieta , wpisz ciąg btnZapisz w polu Identyfikator , a następnie kliknij pozycję Edytuj kod formularza.
  5. Dodaj następujący kod 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>");
    }
    
    

Uwaga

W tym kodzie zastąp ciąg lokalizacją, w której chcesz zapisać plik.

Upewnij się, że szablon formularza programu InfoPath jest w pełni zaufany

Aby można było przetestować ten formularz, szablon formularza programu InfoPath musi być w pełni zaufany. Aby upewnić się, że szablon formularza programu InfoPath jest w pełni zaufany, możesz użyć jednej z następujących metod:

  • Użyj narzędzia Konfiguracja programu Microsoft .NET Framework 1.1, aby przyznać uprawnienia pełnego zaufania tylko do kodu języka Visual C#.

  • Użyj narzędzia RegForm z zestawu InfoPath Software Development Kit (SDK), aby formularz był w pełni zaufanym formularzem. Daje to uprawnienia pełnego zaufania do kodu języka Visual C#.

  • Użyj certyfikatu podpisywania kodu, aby cyfrowo podpisać plik szablonu formularza (xsn). Podczas podpisywania cyfrowego pliku szablonu formularza przy użyciu certyfikatu podpisywania kodu użytkownicy są monitowane o zaufanie do formularza po otwarciu formularza. Dzięki temu formularz jest w pełni zaufany. W związku z tym uprawnienia pełnego zaufania są przyznawane do kodu języka Visual C#.

  • Aby formularz był w pełni zaufany, użyj makra IPFullTrust z zestawu InfoPath SDK. Makro IPFullTrust automatyzuje ustawianie pliku manifestu (xsf) i pliku szablonu formularza w projekcie programu InfoPath w celu pełnego zaufania, a następnie makro IPFullTrust automatycznie rejestruje szablon formularza.

    Aby uzyskać więcej informacji na temat instalowania makra i korzystania z niego, odwiedź następującą witrynę sieci Web Microsoft Developer Network (MSDN):

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

  • Użyj zewnętrznej automatyzacji w programie InfoPath, aby wywołać metodę RegisterSolution. Zazwyczaj ta metoda jest używana tylko do tworzenia formularzy, ponieważ zarejestrowany formularz rejestruje się tylko dla pojedynczego komputera. W przypadku wszelkich dodatkowych formularzy inni użytkownicy muszą zarejestrować dodatkowe formularze na własnych komputerach. Nie zalecamy tej metody dla dodatkowych formularzy. Zalecamy dowolną z poprzednich metod podczas publikowania formularza.

Ponieważ ten formularz jest w trakcie opracowywania formularzy, możesz użyć ostatniej metody. W tym celu znajdź szablon formularza AttachmentEncoding InfoPath, a następnie wykonaj następujące kroki:

  1. W menu Narzędzia kliknij pozycję Opcje formularza.

  2. Kliknij kartę Zabezpieczenia.

  3. Kliknij, aby wyczyścić pole wyboru Automatycznie określ poziom zabezpieczeń na podstawie projektu formularza (zalecane ).

    Uwaga Program InfoPath nie może automatycznie wykryć logiki biznesowej, która wymaga uprawnień pełnego zaufania. W związku z tym należy jawnie przyznać uprawnienia Pełna relacja zaufania.

  4. Kliknij pozycję Pełne zaufanie, a następnie kliknij przycisk OK.

  5. Zamknij szablon formularza AttachmentEncoding InfoPath. Jeśli zostanie wyświetlony monit o zapisanie zmian, kliknij przycisk Tak.

    Uwaga Nie zamykaj projektu programu Visual Studio .NET 2003.

  6. W programie Visual Studio .NET 2003 kliknij dwukrotnie plik Manifest.xsf w Eksplorator rozwiązań. Zostanie otwarty plik Manifest.xsf.

  7. W węźle głównym znajdź atrybut publishUrl. Usuń atrybut publishUrl i wartość atrybutu publishUrl.

  8. Zapisz zmiany, a następnie zamknij plik Manifest.xsf.

  9. Kliknij przycisk Start, kliknij przycisk Uruchom, wpisz Notatnik, a następnie kliknij przycisk OK.

  10. Dodaj następujący kod do pustego pliku tekstowego.

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

    Uwaga W tym kodzie zastąp project_folder_url ścieżką pliku Manifest.xsf w folderze projektu. Pamiętaj, aby uniknąć ścieżki pliku Manifest.xsf. Wszystkie pojedyncze ukośnienia odwrotne (\) w ścieżce muszą zostać zastąpione dwoma ukośnikami odwrotnymi (\\).

  11. Zapisz plik Manifest.xsf na komputerze jako plik Register.js.

  12. Aby wywołać metodę RegisterSolution, kliknij dwukrotnie utworzony plik Register.js .

Testowanie formularza

  1. W projekcie AttachmentEncoding Visual Studio .NET 2003 kliknij przycisk Start w menu Debugowanie . Spowoduje to uruchomienie formularza programu InfoPath w trybie podglądu.

  2. W formularzu InfoPath wpisz ścieżkę pliku, który chcesz dołączyć w polu tekstowym, a następnie kliknij przycisk Dołącz.

    Uwaga Kliknij dwukrotnie kontrolkę Załącznik pliku , aby sprawdzić, czy plik jest poprawnie zakodowany.

  3. Kliknij Zapisz. Znajdź ścieżkę podaną w sekcji "Dodaj przycisk Zapisz do formularza programu InfoPath".

  4. Aby zakończyć test, kliknij przycisk Zamknij podgląd.

Informacje

Aby uzyskać więcej informacji na temat formatu nagłówka załącznika pliku, odwiedź następującą witrynę sieci Web MSDN:

Dołączanie plików w programie InfoPath 2003 https://msdn.microsoft.com/en-us/library/aa168351(office.11).aspx