سؤال

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

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

المحلول

يمكنك قراءة الملف في مخزن مؤقت للإدخال ثم حذف الملف وإرسال المخزن المؤقت للمستخدم بدلا من الملف الفعلي.

نصائح أخرى

من الصعب معرفة متى انتهى المستخدم بالفعل من تنزيل الملف، ولا تريد حذفه قبل القيام بذلك، لذلك نصيحتي هي حذف الملفات الأقدم من فترة زمنية معينة، على سبيل المثال> 24 ساعة.

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

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

من الأسهل الحصول على مساحة كافية لبضعة أيام من البيانات وحذف الملفات بين الحين والآخر.

بطريقة لطيفة حقا، هي في Global.asax

أعتقد ذلك يستخدم شيئا مشابها، على الرغم من أنني نسيت ما ... (أنا متأكد من أنني سرقت هذا الكود قبالة لهم)

private static CacheItemRemovedCallback OnCacheRemove = null;

private void AddTask(string name, int seconds)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, seconds, null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
}

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // delete old spreadsheets every hour
    AddTask("DeleteDayOldSpreadsheets", 3600);

}

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
    // do stuff here
    switch (k)
    {
        case "DeleteDayOldSpreadsheets":
            // TODO: add your magic DELETE OLD SPREADSHEET code here
            break;    

        default:
            break;
    }

    // re-add our task so it recurs
    AddTask(k, Convert.ToInt32(v));
}

أعرف أن السؤال قد طلب وقتا في وقت ما مرة أخرى، لكنه ظن أن هذه النصيحة ستكون مفيدة.

فيما يلي رمز C # الذي يفعل الخدعة.

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

رابط المراجع

private void DownloadFile()
{
    Response.ContentType = ContentType;
    Response.AppendHeader("Content-Disposition", "attachment; filename=myFile.txt");
    Response.WriteFile(Server.MapPath("~/uploads/myFile.txt"));
    Response.Flush();   
    // Delete the file just before execute Response.End()
    System.IO.File.Delete(Server.MapPath("~/uploads/myFile.txt"));
    Response.End();
}

كما جاء في مايكروسوفت KB 257757., ، توصي مايكروسوفت ضد استخدام الأتمتة على الخادم:

"لا توصي Microsoft حاليا، ولا تدعم وأتمتة تطبيقات Microsoft Office من أي تطبيق أو مكون أو مكون عميل غير تفاعلي غير مراقب (بما في ذلك ASP و ASP.NET و DCOM و NT)، لأن Office قد يظهر سلوكا غير مستقر و / أو الجمود عندما يتم تشغيل المكتب في هذه البيئة."

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

يمكنك الاطلاع على عينات ASP.NET Excel الإبلاغ مع مصدر C # و VB هنا وتنزيل نسخة تجريبية مجانية هنا إذا كنت ترغب في تجربته بنفسك.

إخلاء المسئولية: أنا أملك

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