28 mars 2011

INFOPATH : Ajout pièce jointe

Récemment, je suis tombé sur la problèmatique de préremplir le champ de pièce jointe d'un formulaire InfoPath. Cette opération s'avère plus compliqué que ce que l'on croit à cause du principe de fonctionnement du champ pièce jointe d'InfoPath (le document est stocké en binary64 dans le xml et le nom du document est encodé dans la chaine).

Le petit bout de code suivant vous permettra d'insérer facilement des données dans un champ pièce jointe:
public String CreateInfoPathAttachment(String fileName, byte[] fileData)
{
   // This memory stream for InfoPath attachment buffer before Base64 encoding.
   using (MemoryStream ms = new MemoryStream())
   {
          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)fileData.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 });
                    bw.Write(fileData);
          }
          return Convert.ToBase64String(ms.ToArray());
   }
}
Ensuite il suffit d'appeler cette fonction de la manière suivante:


XPathNavigator PJ = this.MainDataSource.CreateNavigator().SelectSingleNod("//my:PJ", NamespaceManager);
if (PJ.MoveToAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"))
          PJ.DeleteSelf();
string s = CreateInfoPathAttachment("toto.gif",fileBuffer);
PJ.SetValue(s);

Aucun commentaire:

Enregistrer un commentaire