public partial class UploadAvatar : System.Web.UI.Page
{
    //معمولا فایل های با پسوند عکس ها و پی دی اف و زیپ را اجازه آپلودش رو برای کاربر قرار میدهیم
    //برای آپلود , فایل های تصویری نیاز به تنظیمات بیشتری دارند
    //در بین فایل های تصویری پسوند جی پی جی نیازمند تنظیمات بیشتری دارد
    protected void Page_Load(object sender, System.EventArgs e)
    {
      
        divPageMessages.Visible = false;
      
    }
    //تا وقتی فایل آپلود نشود این ایونت فعال نمیشود
    protected void btnSubmit_Click(object sender, System.EventArgs e)
    {
        if (Page.IsValid)
        {
          
            //در یک متغیر کمکی فایل آپلود را قرار میدهیم
            //این کنترل به اچ تی ام الی به نام اینپوت تاپ فایل تبدیل میشود
            //در وب 2 متغیر هست که اگر فضا کافی باشه این متغیر ها بدون تغییر میمانند
            //در غیر اینصورت روی این 2 متغییر عمل اورراید صورت میگیرد
            //اول متغیرهای سشن و دوم متغیرهای آپلود
            //بهمین دلیل شروطی را که برای آپلود و سشن مینویسیم معمولا در شرایط غیر طبیعی 
            //و هنگامی که رم سیستم با کمبود مواجه میشود اتفاق میافتد

            //متغیر آپلود از جنس اچ تی تی پی پستد فایل میباشد
            //جهت سهولت کار این متغیر را در یک متغیر کمکی از جنس اچ تی تی پی پستد فایل قرار میدهیم
            System.Web.HttpPostedFile oHttpPostedFile = myFileUpload.PostedFile;
          
            //شرایط غیر طبیعی
            if (oHttpPostedFile == null)
            {
                string strErrorMessage =
                    "!آپلود فایل با مشکل مواجه شده است لطفا مجددا سعی نمائید";

                DisplayErrorMessage(strErrorMessage);
                return;
            }
            
            //اگر فایل رو انتخاب نکرده باشید
            if (oHttpPostedFile.FileName.Trim() == string.Empty)
            {
                string strErrorMessage =
                    "! فایل آواتار مشخص نشده است";

                DisplayErrorMessage(strErrorMessage);
                return;
            }
          
            //یک نمونه از پسوند فایل ها رو مورد بررسی قرار میدهیم  
            //بقیه فایل ها به همین ترتیب هست

            //فایل را در  سایت ذخیره میکنیم
            string strFileName =
                System.IO.Path.GetFileName(oHttpPostedFile.FileName);

            string strFileExtension =
                System.IO.Path.GetExtension(strFileName).ToUpper();
         
            //اگر پسوند مورد نظر وارد نشه
            if ((strFileExtension != ".JPG") &&
                (strFileExtension != ".JPEG") &&
                (strFileExtension != ".JPE"))
            {
                string strErrorMessage =
                    " ! میباشد jpeg پسوند مجاز برای آپلود عکس";

                DisplayErrorMessage(strErrorMessage);
                return;
            }
          
            //ماهیت فایل را مورد بررسی قرار میدهیم 
            //تا واقعا مشخص شده فایل با پسوند مورد نظر هست و یا عمدا رینیم شده است
            //جی پی جی کانتنت تایپ بیشتر از یکی است  ولی در بقیه موارد اکثر یکی است
            string strContentType =
                oHttpPostedFile.ContentType.ToUpper();

            if ((strContentType != "IMAGE/JPEG") && // Firefox!
                (strContentType != "IMAGE/PJPEG"))  // Internet Explorer!
            {
                string strErrorMessage =
                    "! پسوند فایل تغییر داده شده است ";

                DisplayErrorMessage(strErrorMessage);
                return;
            }
           
            //مشکل ترافیک سایت رو چک میکنیم که حجم آپلود شده صفر نباشه
            if (oHttpPostedFile.ContentLength == 0)
            {
                string strErrorMessage =
                    " !آپلود فایل با مشکل مواجه شده است لطفا مجددا سعی نمائید";

                DisplayErrorMessage(strErrorMessage);
                return;
            }
         
            //حجم فایل رو مورد بررسی قرار  میدهیم 300 کیلو بایت
            if (oHttpPostedFile.ContentLength > 200 * 1024)
            {
                string strErrorMessage =
                    "! حداکثر حجم مجاز برای آپلود 200 کیلوبایت میباشد";

                DisplayErrorMessage(strErrorMessage);
                return;
            }

            //اگر فایل آپلود شده تصویری نباشد چک کردن فایل تا همین مرحله کفایت میکند
            //درصورتی که فایل تصویری باشد مراحل ذیل را ادامه میدهیم
           
            //برای طول و عرض محدودیت قائل میشیم
            //با توجه به فرام استریم
            //اگر با فرام فایل اقدام به اینکار کنیم نیازه که ابتدا در سایت ذخیره کنیم
            //وبعد طول و عرض رو چک کنیم که این کار علاوه بر اوورهد زیاد در صورتی که فایل دارای طول و عرض مورد نظر نباشد
            //پاک کردن فایل از سرور ممکن است با مشکلاتی همراه باشد
            System.Drawing.Image oImage =
                System.Drawing.Image.FromStream(oHttpPostedFile.InputStream);
           
            if ((oImage.Width > 200) || (oImage.Height > 200))
            {
                string strErrorMessage =
                    " ! حداکثر طول و عرض برای فایل 200 پیکسل میباشد";

                DisplayErrorMessage(strErrorMessage);
                return;
            }
          
            //اگر این مشکل ها وجود نداشت فایل رو در مسیر فیزیکی ذخیره میکنیم
            string strRootRelativePath = "~/Uploads";
            
            //مراحل تبدیل فایل نسبی به فایل فیزیکی
            string strPath =
                Server.MapPath(strRootRelativePath);

            if (System.IO.Directory.Exists(strPath) == false)
            {
                System.IO.Directory.CreateDirectory(strPath);
            }
          
            string strPathName =
                string.Format("{0}\\{1}", strPath, strFileName);
          
            //ذخیره کردن نهایی
            oHttpPostedFile.SaveAs(strPathName);
          
            divImageOfAvatar.Visible = true;
            //الاین نمودن تصویر در صفحه
            imgAvatar.ImageUrl = "~/Uploads/" + strFileName;
            imgAvatar.ImageAlign = System.Web.UI.WebControls.ImageAlign.AbsMiddle;
         
            string strInformationMessage =
                "! فایل با موفقیت آپلود گردید";

            DisplayInformationMessage(strInformationMessage);
            return;
          
        }
    }

    protected virtual void DisplayErrorMessage(string message)
    {
        divPageMessages.Visible = true;

        litPageMessages.Text =
            string.Format("<div class='error'>{0}</div>", message);
    }

    protected virtual void DisplayInformationMessage(string message)
    {
        divPageMessages.Visible = true;

        litPageMessages.Text =
            string.Format("<div class='information'>{0}</div>", message);
    }

  
}