مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

kaveh.norozi

عضویت از 1394/11/30

مشکل کند شدن، عدم پاسخ سرور به درخواست ها

  • چهارشنبه 4 مرداد 1396
  • 22:33
تشکر میکنم

باسلام

من تو پروژه بایگانی اسناد قسمت آپلود چند فایل رو اوکی کردم و برنامه نویسی طوری انجام شده که همه فایلهای منتخب هم آپلود میشه و هم در دیتابیس تحت عنوان و کد پرونده مورد نظر ذخیره میشه!!!

کاملا بدون اشکال و درست کار انجام میشه!!!

مشکل من اینجاست  بعد از پابلیش سایت وقتی فایلها که کمی حجم بالایی دارن آپلود میشه زمان میبره تا این عمل انجام بشه! یعنی اینکه مثلا 10 تا فایل عکس که با کیفیت 300DPI اسکن شده برای آپلود انتخاب میشه که سیستم حدودا چند ثانیه طول میده تا آپلود انجام بشه، چون من میخام بعد آپلود تو دیتابیس هم ذخیره بشه از JsonResult استفاده کردم و تو DB ذخیره میکنم

زمان بردن برای آپلود هم مشکل من نیست، مشکل من اینجاست زمانی که یه سیستم آپلود میکنه ، سایر قسمت ها کار نمیکنه تا زمانی که آپلود تموم بشه!!!!!!

به ذهنم رسید از Async و Await استفاده کنم ولی هنوز پیاده سازی نکردم ، میخام ببینم این روش بنظرتون درسته یعنی از Async استفاده کنم؟ یا اینکه روش دیگه ای استفاده کنم

ذخیره به این صورت انجام میشه:

   

من برای آپلود فایلها، اکشن هارو بصورت ایجکس فراخوانی میکنم بصورت زیر:

 function RunUploadAks() {
        
        if (window.FormData !== undefined) {
            var fileUpload = $("#UploadImage").get(0);
            var files = fileUpload.files;
            var fileData = new FormData();
            for (var i = 0; i < files.length; i++) {
                fileData.append(files[i].name, files[i]);
            }
            var stdIs = $("#STDID").val();
            var folderIs = $("#FolderID").val();

            fileData.append('STDIDis', stdIs);
            fileData.append('FolderIDis', folderIs);
            $.ajax({
                url: '@Url.Action("UploadGroupFiles", "Files")',
                type: "POST",
                contentType: false, // Not to set any content header
                processData: false, // Not to process data
                data: fileData,
                success: function (result) {
                    var fileGroupnameis = result;
                    var FileCount = fileGroupnameis.length;
                    for (var i = 0; i < FileCount; i++) {
                        $("#FileName").val(fileGroupnameis[i]);
                        $("#FileSource").val(fileGroupnameis[i]);
                        var a1 = $("#Counter").val();
                        var a2 = $("#FolderID").val();
                        $("#FileID").val(a2 + a1);
                        //------------------------------از اینجا سیو
                        var url = '@Url.Action("SaveGroupFileByJson", "Files")';
                        var sendingdata1 = $("#FrmAddFolder").serialize();
                        var SendingData = sendingdata1;
                        $.post(url, SendingData, function (ReciviedData) {
                            if (!ReciviedData.Success) {
                                alert(ReciviedData.MessageText);
                            }
                            else {
                                //ذخیره عکس پروفایل

                                //.................
                                // alert(ReciviedData.MessageText);


                                //document.location="AddFileToFolder";
                            }
                        })
                        //------------------------------تا اینجا سیو
                        setInterval(1000);
                    }
                    alert("ذخیره با موفقیت انجام شد");
                    $("#BtnSaveFolder").removeClass("hidden");


                },
                error: function (err) {
                    alert(err.statusText);
                }
            });
        } else {
            alert("FormData is not supported.");
        }
        $("#WaitingImage").addClass("hidden");
    }

توضیح کد های بالا:

من فایلهارو انتخاب میکنم و جهت آپلود ارسال میکنم، در این صورت تابع بالا فراخوانی میشه که عکس ها منتخب منو به یه اکشن به اسم UploadGroupFiles میفرستم که آپلود رو انجام بده و نتیجه که اسم و آدرس همه فایلها هستو برگردونه

بعد نتیجه رو به یه اکشن دیگه برای ذخیره کردن تو دیتابیس میفرستم البته چون تعداد دارن داخل یه حلقه قراردادم و به اندازه طول فایلها این حلقه تکرار میشه و تو دیتابیس ذخیره میشه

این کار زمان بره و تا مرحله کامل بشه سیستم به خواب زمستونی میره!!!!!!!!!!!

راهنمایی کنید چکار کنم!!!؟

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

kaveh.norozi

عضویت از 1394/11/30

  • چهارشنبه 4 مرداد 1396
  • 22:51

جالبه!!!!

الان داشتم متن خودمو میخوندم که یهو چشم افتاد به setInterval(1000) ، چه اشتباهی!!!!!

برای تست نرم افزار اینو نوشته بودم یادم رفته پاکش کنم!!!!! این خودش تو 20 تا فایل میشه 20 ثانیه!!!!!

ولی باز مشتاقم بدونم Async بدردم میخوره یا نه

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 4 مرداد 1396
  • 22:56

1)آیا خود فایل را در بانک اطلاعاتی ذخیره می کنید ؟

2)با کد های سمت Clinet نمی شود علت کند بودن را تشخص داد، بهتر است کدهای سمت سرور را قرار دهید.

3)آیا از EF استفاده می کنید؟

4)پیشنها می کنم Life Cycle این درخواست را Trace کنید و متد های Hot پیدا کنید پس از این کار Query های ارسال شده به بانک را بررسی کنید.

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • پنجشنبه 5 مرداد 1396
  • 08:30

بله استفاده از Async میتونه درخواست ها رو موازی پردازش کنه و در سرعت پاسخگویی به در خواست های بالا بسیار مفید است

کاربر سایت

kaveh.norozi

عضویت از 1394/11/30

  • جمعه 6 مرداد 1396
  • 09:25

باسلام

در پاسخ به آقای علیزاده:

1) خیر مسیر فایلها تو دیتابیس ذخیره میشه و فایلها در یک فولدر به نام پرونده جداگانه ذخیره میشه

2) در ادامه

3) بله از EF استفاده میکنم

4) Ok

خطوط کد برای آپلود شدن دسته فایلها :

      [HttpPost]
        public ActionResult UploadGroupFiles()
        {
            //یه آرایه از نام فایلهای انتخاب شده می سازم 
            string[] ResultFile = new string[Request.Files.Count];
            //از فایلی انتخاب شده بود
            if (Request.Files.Count > 0)
            {
                try
                {
                    //نمونه گیری از فایلها
                    HttpFileCollectionBase files = Request.Files;
                    for (int i = 0; i < files.Count; i++)
                    {
                        //این اطلاعاتیه که برای ایجاد فولدر به نام پرونده نیاز دارم و زمان آپلود فایل به  دیتا Append میکنم
                        var folderName = Request.Form["FolderIDis"];
                        var studentiD = Request.Form["STDIDis"];
                        //مسیر فولدر مربوط به پرونده رو انتخاب میکنم
                        var FolderPath = Server.MapPath("~/FoldersFiles/" + folderName + "/");
                        //فولدر مربوط به پرونده رو میسازم
                        System.IO.Directory.CreateDirectory(FolderPath);
                        string path = AppDomain.CurrentDomain.BaseDirectory + "FoldersFiles/" + folderName + "/";
                        //یه نمونه گیری دیگه ازنوع فایل
                        HttpPostedFileBase file = files[i];
                        string fname;
                        if (Request.Browser.Browser.ToUpper() == "IE" || Request.Browser.Browser.ToUpper() == "INTERNETEXPLORER")
                        {
                            // این مربوط به اینترنت اکسپلورر
                            string[] testfiles = file.FileName.Split(new char[] { '\\' });
                            fname = testfiles[testfiles.Length - 1];
                            ResultFile[i] = folderName + "/" + fname;
                            fname = System.IO.Path.Combine(Server.MapPath("~/FoldersFiles/" + folderName + "/"), fname);
                            file.SaveAs(fname);
                        }
                        else
                        {
                            // اینجا برای ذخیره فایرفاکس ، گوگل کروم و ...
                            Guid Privateid = Guid.NewGuid();
                            //نام فایل شامل : یک کد یکتا( جی یو آیدی) بعلاوه کد دانشجو بعلاوه نام فایل ارسالی
                            fname = Privateid + studentiD + file.FileName;
                            //نام و مسر در یه آرایه ذخیره میشه
                            ResultFile[i] = folderName + "/" + fname;
                            //مسیر دخیره فایل انتخاب میشه
                            fname = System.IO.Path.Combine(Server.MapPath("~/FoldersFiles/" + folderName + "/"), fname);
                            //فایل ذخیره میشه
                            file.SaveAs(fname);
                        }
                        // اینجا حلقه ادامه داره تا زمانی که همه فایلها آپلود بشه
                    }
                    // نتیجه آپلود ارسال میشه که شامل یه آرایه که نام فایلها می باشد است 

                    return Json(ResultFile);
                }
                catch (Exception ex)
                {
                    return Json("Error occurred. Error details: " + ex.Message);
                }
            }
            else
            {
                return Json("No files selected.");
            }
        }

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)