كيف يتم ترميز وفك ترميز ملف مرفق برمجياً باستخدام Visual C# في InfoPath 2003

ملخص

في Microsoft Office InfoPath 2007 أو في Microsoft Office InfoPath 2003 Service Pack 1 (SP1)، يمكنك استخدام عنصر تحكم ملف مرفق لإرفاق ملف إلى قالب نموذج InfoPath. في ظروف معينة، قد تحتاج إلى ترميز وفك الملف المرتبط بعنصر التحكم ملف مرفق ثم. في هذه الحالة، يمكنك استخدام Microsoft Visual C# لإنشاء فئة التشفير وفئه وحدة فك الترميز . وبعد ذلك، يمكنك استخدام فئة التشفير وفئه وحدة فك ترميز لترميز وفك ترميز الملف المرفق.

مقدمة

يقدم هذا المقال كيفية ترميز وفك ترميز ملف مرفق برمجياً باستخدام Microsoft Visual C# في InfoPath 2003. لمزيد من المعلومات حول كيفية القيام بذلك في InfoPath 2010 أو في InfoPath 2007، راجع صفحة الويب التالية: كيفية ترميز وفك ترميز ملف مرفق برمجياً باستخدام Visual C# في InfoPath 2010 أو في InfoPath 2007 .

مزيد من المعلومات

تقدم Microsoft أمثلة برمجية للتوضيح فقط، دون أي ضمان صريح أو ضمني. هذا يتضمن، على سبيل المثال لا الحصر، الضمانات الضمنية الخاصة بالتسويق أو الملاءمة لغرض معين. تفترض هذه المقالة أنك معتاد على لغة البرمجة التي يتم شرحها والأدوات المستخدمة لإنشاء الإجراءات وتصحيحها. يساعد مهندسو الدعم لدى Microsoft في شرح وظيفة إجراء محدد، لكنهم لن يقوموا بتعديل هذه الأمثلة لتقديم وظيفة إضافية أو إنشاء إجراءات تستوفي متطلبات محددة.

إنشاء مشروع Visual C# InfoPath 2003

  1. بدء تشغيل Microsoft Visual Studio.NET 2003.
  2. من القائمة ملف ، انقر فوق
    جديد، ثم انقر فوق المشروع.
  3. في مربع الحوار مشروع جديد ، انقر فوق
    مشاريع visual C# في مجلد Microsoft Office InfoPath المشاريع.
  4. في المربع الاسم ، اكتب
    أتتاتشمينتينكودينجومن ثم انقر فوق
    OK.
  5. في معالج مشروع Microsoft Office، انقر فوق
    إنشاء قالب نموذج جديد، ومن ثم انقر فوق
    قم إنهاء.

    معالج Microsoft Office Project بإنشاء مشروع Visual Studio.NET 2003 جديد يسمى أتتاتشمينتينكودينج. يتم أيضا إنشاء قالب نموذج InfoPath. قالب نموذج InfoPath يسمى أتتاتشمينتينكودينج.

إنشاء فئة التشفير في Visual Studio.NET 2003

  1. في "مستكشف الحلول"، انقر بالزر الأيمن
    أتتاتشمينتينكودينج، أشر إلى إضافةومن ثم انقر فوق إضافة عنصر جديد.
  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. في "مستكشف الحلول"، انقر بالزر الأيمن
    أتتاتشمينتينكودينج، أشر إلى إضافةومن ثم انقر فوق إضافة عنصر جديد.
  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. في قالب نموذج InfoPath أتتاتشمينتينكودينج، انقر فوق عناصر التحكم في جزء المهام تصميم المهام .
  2. في جزء المهام عناصر التحكم ، انقر فوق ملف مرفق تحت
    إدراج عناصر تحكم.
  3. انقر فوق عنصر التحكم ملف مرفق ، وثم انقر فوق خصائص ملحق الملف.
  4. في مربع الحوار خصائص ملحق الملف ، اكتب theAttachmentField في المربع اسم الحقل ، ومن ثم انقر فوق موافق.
  5. في جزء المهام عناصر التحكم ، انقر فوق مربع نص ضمن
    إدراج عناصر تحكم.
  6. انقر فوق عنصر التحكم مربع النص ومن ثم انقر فوق خصائص مربع النص.
  7. في مربع الحوار خصائص مربع النص ، اكتب theAttachmentName في المربع اسم الحقل ، ومن ثم انقر فوق موافق.

إضافة زر إرفاق إلى نموذج InfoPath

  1. في جزء المهام عناصر التحكم ، انقر فوق زر أسفل
    إدراج عناصر تحكم.
  2. انقر نقراً مزدوجاً فوق عنصر تحكم الزر الجديد ومن ثم انقر فوق خصائص الزر.
  3. في مربع الحوار خصائص الزر ، اكتب
    إرفاق في المربع التسمية ، اكتب
    بتناتاتش في المربع معرف ، ثم انقر فوق
    قم تحرير التعليمات البرمجية للنموذج.
  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. قم بالتبديل إلى قالب نموذج InfoPath أتتاتشمينتينكودينج.
  2. في جزء المهام عناصر التحكم ، انقر فوق زر أسفل
    إدراج عناصر تحكم.
  3. انقر نقراً مزدوجاً فوق عنصر تحكم الزر الجديد ومن ثم انقر فوق خصائص الزر.
  4. في مربع الحوار خصائص الزر ، اكتب
    حفظ في مربع التسمية ، اكتب
    بتنسافي في المربع معرف ، ثم انقر فوق
    قم تحرير التعليمات البرمجية للنموذج.
  5. أضف التعليمات البرمجية التالية إلى الأسلوب _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 الموثوق به ثقة كاملة:
  • استخدام أداة تكوين Microsoft.NET Framework 1.1 لمنح أذونات "ثقة كاملة" فقط للتعليمات البرمجية Visual C#.
  • استخدام أداة RegForm من مجموعة تطوير InfoPath البرامج (SDK) لجعل النموذج نموذج موثوق به ثقة كاملة. وهذا يمنح أذونات "الثقة الكاملة" للتعليمات البرمجية Visual C#.
  • استخدام شهادة توقيع التعليمات البرمجية لتوقيع ملف قالب النموذج (.xsn). عند استخدام شهادة توقيع التعليمات البرمجية لتوقيع ملف قالب النموذج، يتم مطالبة المستخدمين بالثقة في النموذج عندما يقومون بفتح النموذج. وهذا يجعل النموذج موثوق به ثقة كاملة. لذلك، يتم منح أذونات "ثقة كاملة" للتعليمات البرمجية Visual C#.
  • استخدم الماكرو IPFullTrust من InfoPath SDK لجعل النموذج نموذج موثوق به ثقة كاملة. الماكرو IPFullTrust بأتمتة إعداد ملف البيان (.xsf) وملف قالب النموذج في InfoPath المشروع للثقة الكاملة، ومن ثم يقوم الماكرو IPFullTrust تلقائياً بتسجيل قالب النموذج.

    لمزيد من المعلومات حول كيفية تثبيت واستخدام الماكرو، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
  • استخدم الأتمتة الخارجية في InfoPath لاستدعاء الأسلوب RegisterSolution . بشكل عام، هذا الأسلوب يستخدم فقط لتطوير نموذج لتسجيل نموذج مسجلة فقط لكمبيوتر فردي. أية نماذج إضافية، يجب على المستخدمين الآخرين تسجيل نماذج إضافية على أجهزة الكمبيوتر الخاصة بهم. لا ننصح هذا الأسلوب لنماذج إضافية. نوصي بأية طريقة من الطرق السابقة عندما تقوم بنشر النموذج.
نظراً لأن هذا النموذج تحت التطوير النموذج، يمكنك استخدام أسلوب آخر. للقيام بذلك، حدد موقع قالب نموذج InfoPath أتتاتشمينتينكودينج ومن ثم اتبع الخطوات التالية:
  1. من القائمة أدوات ، انقر فوق " خيارات النموذج".
  2. انقر فوق علامة التبويب أمان .
  3. انقر لإلغاء تحديد خانة الاختيار تحديد مستوى الأمان استناداً إلى تصميم النموذج (مستحسن) تلقائياً .

    ملاحظة: لا يمكن كشف InfoPath تلقائياً منطق تسلسل العمل يتطلب أذونات "ثقة كاملة". ولذلك، يجب منح أذونات "ثقة كاملة" بشكل صريح.
  4. انقر فوق ثقة كاملةومن ثم انقر فوق
    OK.
  5. إغلاق قالب نموذج InfoPath أتتاتشمينتينكودينج. إذا تم مطالبتك بحفظ التغييرات، انقر فوق نعم.

    ملاحظة: لم يتم إغلاق مشروع Visual Studio.NET 2003.
  6. في Visual Studio.NET 2003، انقر نقراً مزدوجاً فوق
    Manifest.xsf الملف في "مستكشف الحلول". يفتح الملف Manifest.xsf.
  7. في عقده الجذر، بتحديد موقع السمة publishUrl . قم بإزالة السمة publishUrl وقيمة السمة publishUrl .
  8. التغييرات الخاصة بك، ثم احفظ وأغلق الملف Manifest.xsf.
  9. انقر فوق ابدأ، ثم انقر فوق تشغيل، اكتب "المفكرة"وثم انقر فوق
    OK.
  10. أضف التعليمات البرمجية التالية إلى ملف نصي فارغ.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite");

    ملاحظة: في هذه التعليمة البرمجية، استبدال
    < project_folder_url > مع مسار الملف Manifest.xsf في مجلد المشروع الخاص بك. تذكر أن مسار الملف Manifest.xsf الهروب. يجب استبدال كل واحدة مائلة عكسية () في المسار بشرطتين مائلتين عكسيتين (\).
  11. حفظ الملف Manifest.xsf على الكمبيوتر كملف Register.js.
  12. استدعاء الأسلوب RegisterSolution ، انقر نقراً مزدوجاً فوق الملف Register.js الذي قمت بإنشائه.

اختبار النموذج

  1. في مشروع أتتاتشمينتينكودينج Visual Studio.NET 2003، انقر فوق ابدأ في القائمة تصحيح . يؤدي هذا إلى تشغيل نموذج InfoPath في وضع المعاينة.
  2. في نموذج InfoPath، اكتب مسار الملف الذي تريد إرفاقه في مربع النص، ثم انقر فوق
    إرفاق.

    ملاحظة: انقر نقراً مزدوجاً فوق عنصر التحكم ملف مرفق للتحقق من أن ترميز الملف بشكل صحيح.
  3. انقر فوق حفظ. تحديد موقع المسار الذي قمت بتوفيره في مقطع "إضافة زر حفظ إلى نموذج InfoPath".
  4. لإنهاء الاختبار، انقر فوق إغلاق المعاينة.

المراجع

لمزيد من المعلومات حول تنسيق رأس الملف المرفق، قم بزيارة موقع Msdn التالي:
خصائص

رقم الموضوع: 892730 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

Microsoft Office InfoPath 2003

تعليقات