نمایش حداکثر اندازه مجاز فایل قابل آپلود به کاربر، در ASP.Net
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه


گاهی از اوقات قبل از درگیر شدن با کاربران (!)، بهتر است حداکثر اندازه مجاز فایل قابل ارسال به سرور را به آن‌ها نمایش داد. درغیراینصورت باید پاسخگوی این باشید که چرا فایل 100 مگابایتی که من ارسال کردم، ذخیره نشده و برنامه کار نمی‌کنه!
خطای دریافتی این خواهد بود: Maximum request length exceeded
در ASP.Net اگر هیچ تنظیم خاصی صورت نگرفته باشد، حداکثر اندازه فایل قابل ارسال به سرور، 4 مگابایت است. این مورد را در machine.config و یا در web.config می‌توان تغییر داد.
برای مثال، جهت بالا بردن اندازه فایل قابل ارسال به سرور در وب کانفیگ برنامه به 39 مگابایت، می‌توان سطر زیر را به قسمت system.web اضافه کرد.
<httpRuntime executionTimeout="1200" maxRequestLength="39936" />

البته در این حالت بهتر است executionTimeout را نیز تنظیم نمود (بر اساس ثانیه) تا یک فایل حجیم را بتوانند آپلود کنند و در این حین مشکل timeout رخ ندهد (در اینجا به 20 دقیقه تنظیم شده است).

اما یک نکته را هم باید درنظر داشت. اگر هاست مورد استفاده شما فایل machine.config را قفل کرده باشد (که از لحاظ امنیتی توصیه می‌شود)، سطر فوق در web.config هیچ تاثیری نخواهد داشت.

به همین منظور کلاس زیر را تهیه کرده‌ام که تمامی این موارد را لحاظ می‌کند.
ابتدا مقدار پیش فرض 4 مگابایت درنظر گرفته خواهد شد.
سپس سعی می‌شود که مقدار مجاز MaxRequestLength از فایل machine.config خوانده شود. همچنین وضعیت قفل بودن آن نیز دریافت می‌شود.
اگر این قسمت قابل خواندن بود و همچنین قفل نشده بود، مقدار تنظیم شده maxRequestLength در وب کانفیگ، دریافت و استفاده خواهد شد.
و در آخر، اندازه دریافتی، که بر اساس KB است به شکلی قابل خواندن بازگشت داده می‌شود.

using System;
using System.Configuration;
using System.Web.Configuration;

/// <summary>
/// کلاسی جهت نمایش اندازه مجاز فایل قابل ارسال به سرور
/// </summary>
public class CMaxLimit
{
/// <summary>
/// اندازه مجاز فایل قابل ارسال به سرور
/// </summary>
/// <returns></returns>
public static string MaxFileUploadSizeLimit()
{
//مقدار پیش فرض
int resultKB = 4096;

//machine.config
Configuration mConfig =
WebConfigurationManager.OpenMachineConfiguration();
bool mConfigIsLocked = false;
HttpRuntimeSection section =
mConfig.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
if (section != null)
{
resultKB = section.MaxRequestLength;
mConfigIsLocked = section.ElementInformation.IsLocked;
}

//web.config
if (!mConfigIsLocked)
{
HttpRuntimeSection httpRuntimeSection =
WebConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
if (httpRuntimeSection != null)
{
resultKB = httpRuntimeSection.MaxRequestLength;
}
}

return
SizeToString(resultKB * 1024);
}

/// <summary>
/// نمایش اندازه یک فایل به صورتی قابل درک
/// </summary>
/// <param name="len">اندازه فایل</param>
/// <returns></returns>
public static string SizeToString(long len)
{
int order = 0;
string[] sizes = new[] { "B", "KB", "MB", "GB" };
while (len >= 1024 && order + 1 < sizes.Length)
{
order++;
len = len / 1024;
}
return String.Format("{0:0.##} {1}", len, sizes[order]);
}
}

  • #
    ‫۱۵ سال و ۹ ماه قبل، دوشنبه ۲۳ دی ۱۳۸۷، ساعت ۱۷:۳۱
    سلام استاد نصیری
    در این موردی که فرمودین اگر machin.config قفل باشه اون خط تاثیر گذار نخواهد بود آیا وقتی که قبلش به تگ clear استفاده کنیم هم باز تاثیرگذار نیست؟چون تگ clear تنظیمات والد رو بی تاثیر میکنه.
    ممنون از مطلب مفیدتون
    موفق باشید
  • #
    ‫۱۵ سال و ۹ ماه قبل، دوشنبه ۲۳ دی ۱۳۸۷، ساعت ۱۸:۵۰
    سلام،
    بله، بی اثر خواهد کرد اگر allowOverride که برای قفل کردن ذکر شد ، به false تنظیم نشده باشد.
    http://msdn.microsoft.com/en-us/library/ms178693.aspx
    و همانطور که در راهنمای فوق صریحا ذکر شده، هر تلاشی برای تغییر یک section قفل شده، منجر به بروز یک خطا خواهد شد.

    کلا قفل کردن ماشین کانفیگ برای هاست‌ها طراحی شده تا از یک سری موارد بتوانند جلوگیری کنند. مثلا شما نتونید با impersonation ، بجای یک یوزر ویندوز NT لوکال عمل خاصی را روی هاست اجرا کنید.
    http://www.devx.com/vb2themax/Tip/18801
  • #
    ‫۱۵ سال و ۹ ماه قبل، جمعه ۲۷ دی ۱۳۸۷، ساعت ۰۰:۱۵
    جالب بود استاد.

    فقط یه چیزی به نظرت با این کد میشه کل بخش آپلود رو کنترل کرد.

    به نظرم مقطعی کار کنه.
  • #
    ‫۱۵ سال و ۹ ماه قبل، جمعه ۲۷ دی ۱۳۸۷، ساعت ۰۰:۴۷
    سلام،
    نمی‌دونم دقیقا منظور شما چیست؟
    این کد فقط عبارات درج شده در فایل‌های کانفیگ رو استخراج و نمایش میده. کار خاص دیگری نمیکنه.