ما هي أفضل طريقة لإنشاء ملف نصي في موقع ويب .net؟

StackOverflow https://stackoverflow.com/questions/129927

سؤال

لدي صفحة في تطبيق الويب vb.net الخاص بي والتي تحتاج إلى إرسال مجموعة من البيانات إلى ملف نصي ثم تقديمها إلى المستخدم للتنزيل.ما هي الطريقة الأفضل/الأكثر فعالية لإنشاء مثل هذا الملف النصي على خادم ويب .net؟

يحرر:للإجابة على سؤال أدناه، سيكون هذا بمثابة تنزيل ملف مرة واحدة ثم التخلص منه.

تحديث:لقد قمت بلصق اقتراحات جون رودي وديفيد كيه معًا، وقد عملت بشكل مثالي.شكرا لكم جميعا!

هل كانت مفيدة؟

المحلول

ستعتمد الإجابة على ما إذا كنت، كما تذكر الفاصلة المنقوطة المنقوطة، تحتاج إلى تنزيلات متكررة أو عمليات إلغاء لمرة واحدة.

وفي كلتا الحالتين، سيكون المفتاح هو تعيين نوع محتوى الإخراج لضمان عرض نافذة التنزيل.تكمن مشكلة إخراج النص المستقيم في أن المتصفح سيحاول عرض البيانات في نافذته الخاصة.

ستكون الطريقة الأساسية لتعيين نوع المحتوى شيئًا مشابهًا لما يلي، على افتراض أن النص هو سلسلة الإخراج واسم الملف هو الاسم الافتراضي الذي تريد حفظ الملف (محليًا) به.

HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/octet-stream";
response.Charset = "";
response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", filename));
response.Flush();
response.Write(text);
response.End();

سيؤدي هذا إلى مطالبة المستخدم بالتنزيل.

الآن يصبح الأمر أكثر صعوبة إذا كنت بحاجة إلى حفظ الملف حرفيًا على خادم الويب الخاص بك - ولكن ليس بهذه الدرجة من الصعوبة.هناك تريد كتابة النص إلى ملفك النصي باستخدام الفئات الموجودة في System.IO.تأكد من أن المسار الذي تكتب إليه قابل للكتابة بواسطة مستخدمي خدمة الشبكة وIUSR_MachineName وASPNET Windows.بخلاف ذلك، نفس الصفقة - استخدم نوع المحتوى والعناوين لضمان التنزيل.

أوصي بعدم حفظ الملف حرفيًا إلا إذا كنت بحاجة إلى ذلك - وحتى في هذه الحالة، قد لا تكون تقنية القيام بذلك مباشرة على الخادم هي الفكرة الصحيحة.(على سبيل المثال، ماذا لو كنت بحاجة إلى التحكم في الوصول لتنزيل الملف المذكور؟الآن يتعين عليك القيام بذلك خارج جذر التطبيق الخاص بك، وهو ما قد يكون أو لا يكون ممكنًا اعتمادًا على بيئة الاستضافة الخاصة بك.)

لذلك، دون معرفة ما إذا كنت في وضع لمرة واحدة أو وضع "يجب حفظ الملف حقًا"، ودون معرفة الآثار الأمنية (والتي ربما ستحتاج إلى حلها بنفسك إذا كنت تحتاج حقًا إلى عمليات حفظ من جانب الخادم)، فإن الأمر يتعلق أفضل ما يمكنني تقديمه لك.

نصائح أخرى

استخدم StringBuilder لإنشاء نص الملف، ثم أرسله إلى المستخدم باستخدام Content-Disposition.

المثال موجود هنا:http://www.eggheadcafe.com/community/aspnet/17/76432/use-the-contentdispositi.aspx

private void Button1_Click(object sender, System.EventArgs e)
{
        StringBuilder output = new StringBuilder;
        //populate output with the string content
        String fileName = "textfile.txt";

        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        Response.WriteFile(output.ToString());

}

لا تقم بإنشائه على الإطلاق، استخدم HttpHandler وقم بتقديم الملف النصي مباشرة إلى دفق الإخراج:

http://digitalcolony.com/labels/HttpHandler.aspx

تعد كتلة التعليمات البرمجية الموجودة في المنتصف مثالًا جيدًا، ويمكنك تعديلها بما يناسبك:

public void ProcessRequest(HttpContext context)
{
   response = context.Response;
   response.ContentType = "text/xml";       
   using (TextWriter textWriter = new StreamWriter(response.OutputStream, System.Text.Encoding.UTF8))
   {
       XmlTextWriter writer = new XmlTextWriter(textWriter);
       writer.Formatting = Formatting.Indented;
       writer.WriteStartDocument();
       writer.WriteStartElement("urlset");
       writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
       writer.WriteAttributeString("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");
       writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");

       // Add Home Page
       writer.WriteStartElement("url");
       writer.WriteElementString("loc", "http://example.com");
       writer.WriteElementString("changefreq", "daily");
       writer.WriteEndElement(); // url

       // Add code Loop here for page nodes
       /*
       {
           writer.WriteStartElement("url");
           writer.WriteElementString("loc", url);
           writer.WriteElementString("changefreq", "monthly");
           writer.WriteEndElement(); // url
       }
       */
       writer.WriteEndElement(); // urlset
   }                      
}

ضع في اعتبارك أنه لا يلزم أبدًا أن يكون "ملفًا" في نهاية الخادم.إنه العميل الذي يحوله إلى ملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top