۱۳۸۷/۱۰/۲۳

نمايش حداكثر اندازه مجاز فايل قابل آپلود به كاربر، در 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]);
}
}