Extract کردن فایلهای Zip و Rar درMVC

شنبه 25 اردیبهشت 1395

در این مقاله قصد داریم فایلهایZip و Rar آپلود شده در سایت را با برنامه نویسی ، Extract یا unzip کرده و محتوای داخل فایلها را با دستوراتی چک کنیم.این مورد را با MVC پیاده سازی میکنیم.

  Extract کردن فایلهای Zip  و Rar درMVC

در اینجا ،از فضای نام های Microsoft System.IO.Compression وSystem.IO.Compression.FileSystem  و کلاسهایی مانند ZipArchive   برای اکسترک و unzip کردن فایلهای آپلود شده ، استفاده میشود.

پس از آپلود ، آن را از طریق حلقه بررسی میکنیم و  برای برنامه نویسی سمت کلاینت، از jQuery استفاده میکنیم.

همانطور که شما میدانید، بسیاری از وب سایت برای اینکه  حجم کمی از داده ها به سرور آپلود  شود ،تنها فرمت زیپ یا هر  فرمت زیپ شده دیگر را میپذیرند  . ما می توانیم تقریبا 60 درصد از سایز  را بافرمت زیپ شده کاهش دهیم.

روند پروژه را با  شرح زیر آغاز میکنیم:

ایجاد یک برنامه MVC
نصب جی کوئری
ایجاد Controller و View
آپلود اکشن با استفاده از جی کوئری
اضافه کردن منابع System.IO.Compression، System.IO.Compression.FileSystem
چک کردن فایل با استفاده از کلاس ZipArchive

استفاده از کد

در این بخش برنامه نویسی برنامه را انجام میدهیم

ایجاد یک Controller

در حال حاضر ما یک کنترلر ،  ایجاد میکنیم  که بشرح زیر است:

public ActionResult Index()
        {
            return View();
        }

بروز رسانی View

در حال حاضر در این view، ما یک فایل آپلود و دیگر عناصر مورد نیاز را اضافه می کنیم:

<input type="file" name="FileUpload1" 
id="fileUpload" placeholder="Please select the file" /><br />
<input id="btnUploadFile" type="button" value="Upload File" />
<div id="message"></div>

اضافه کردن منابع JS

اضافه کردن منابع به شرح زیر است.

<script src="~/scripts/jquery-1.10.2.min.js"></script>
<script src="~/scripts/MyScript.js"></script>

در اینجا MyScript.js محل نوشتن برخی ازکدهای اسکریپت است.

استایل المنت (اختیاری)

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

<style>
    #fileUpload {
        border: 1px solid #ccc;
        padding: 10px;
        border-radius: 5px;
        font-size: 14px;
        font-family: cursive;
        color: blue;
    }

    #btnUploadFile {
        border: 1px solid #ccc;
        padding: 10px;
        border-radius: 5px;
        font-size: 14px;
        font-family: cursive;
        color: blue;
    }

    #message {
        border-radius: 5px;
        font-size: 14px;
        font-family: cursive;
        color: blue;
        margin-top: 15px;
    }
    h2 {
        border-radius: 5px;
        font-size: 20px;
        font-family: cursive;
        color: blue;
        margin-top: 15px;
    }
</style>

افزودن اکشن  آپلود در اسکریپت

در حال حاضر، باید اکشن آپلودرا ایجاد کنیم . برای این کار، لطفا به اسکریپت فایل  MyScript.js بروید  و کدهای زیر را وارد کنید:

$(document).ready(function () {
    $('#btnUploadFile').on('click', function () {
        var data = new FormData();
        var files = $("#fileUpload").get(0).files;
        // Add the uploaded image content to the form data collection
        if (files.length > 0) {
            data.append("UploadedImage", files[0]);
        }
        // Make Ajax request with the contentType = false, and procesDate = false
        var ajaxRequest = $.ajax({
            type: "POST",
            url: "Home/Upload",           
            contentType: false,
            processData: false,
            data: data,
            success: function (data) {
                $('#message').html(data);               
            },
            error: function (e)
            {
                console.log('Oops, Something went wrong!.' + e.message);
            }
        });
        ajaxRequest.done(function (xhr, textStatus) {
            // Do other operation
        });
    });
});

 به کنترلر رفته  و یک اکشن  JsonResult به شرح زیر ایجاد میکنیم.

public JsonResult Upload()
        {
            string isValid = checkIsValid(Request.Files);
            return Json(isValid, JsonRequestBehavior.AllowGet);
        }

برای کار با کلاس ZipArchive، شما باید فضای نام زیر را اضافه کنید :

using System.IO.Compression;

در حال حاضر، خطا یی با  عنوان " Are you missing an assembly reference ؟" نشان داده خواهد شد. بنابراین

 منابع  System.IO.Compression و System.IO.Compression.FileSystem را اضافه میکنیم.

برای افزودن آنها  ،بر روی Reference در پروژه خود  کلیک راست  کرده ودر browse  منابع را جستجو میکنیم.

اگر شما از ویژوال استودیو  2015 استفاده میکنید، منابع در مسیر زیر قرار دارند

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6


لطفا توجه داشته باشید که نام پوشه ها  با توجه به نسخه فریم ورک متفاوت است.

در این مرحله ، در  کنترلر کدی برای تابع checkIsValid(Request.Files)  مینویسیم.

private string checkIsValid(HttpFileCollectionBase files)
        {
            string isValid = string.Empty;
            try
            {
                foreach (string upload in Request.Files)
                {
                    if (Request.Files[upload].ContentType == 
                    "application/octet-stream") //Content type for .zip is application/octet-stream
                    {
                        if (Request.Files[upload].FileName != "")
                        {
                            string path = AppDomain.CurrentDomain.BaseDirectory + 
                            "/ App_Data / uploads /";
                            if (!Directory.Exists(path))
                            {
                                // Try to create the directory.
                                DirectoryInfo di = Directory.CreateDirectory(path);
                            }

                            string filename = Path.GetFileName(Request.Files[upload].FileName);
                            string pth = Path.Combine(path, filename);
                            Request.Files[upload].SaveAs(pth);
                            isValid = CheckForTheIcon(pth);
                        }
                    }
                    else
                    {
                        isValid = "Only .zip files are accepted.";
                    }
                }
                return isValid;
            }
            catch (Exception)
            {
                return "Oops!. Something went wrong";
            }
        }

همانطور که می بینید، از طریق حلقه فایل های HttpFileCollectionBase و content type را  بررسی میکنیم.

لطفا توجه داشته باشید که نوع محتوا را برای فایل .zip ، یک application/octet-stream است.

هنگامی که چک انجام شد، ما فایل ها را در یک پوشه ذخیره میکنیم، مسیر را با  تابع  CheckForTheIcon(pth)  ارسال میکنیم. در  گام بعدی ، ما نیاز به ایجاد تابع  CheckForTheIcon() داریم.

private string CheckForTheIcon(string strPath)
      {
          string result = string.Empty;
          try
          {
              using (ZipArchive za = ZipFile.OpenRead(strPath))
              {
                  foreach (ZipArchiveEntry zaItem in za.Entries)
                  {
                      if (zaItem.FullName.EndsWith(".ico", StringComparison.OrdinalIgnoreCase))
                      {
                          result = "Success";
                      }
                      else
                      {
                          result = "No ico files has been found";
                      }
                  }
              }
              return result;
          }
          catch (Exception)
          {
              result = "Oops!. Something went wrong";
              return result;
          }
      }

خروجی برنامه:

آموزش asp.net mvc

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید