Asp.Net Mvc'de Kontrollü Dosya Yükleme ve Silme İşlemi

İbrahim     5 Ekim 2017     2190     2    
Bu makalemde aspnet mvc'de httppostedfilebase sınıfı yardımıyla dosyaları listeleme, kontrollü olarak dosya ekleme ve silme işlemini göstereceğim.

İlk olarak aspnet mvc projesi oluşturalım.

HomeController'imizi oluşturalım.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

 

View'imiz oluşturalım ve layout'umuzu düzenleyelim.

Index.cshtml

@{
    ViewBag.Title = "Dosya Yükle";
}

<div id="anaDiv">
    <div class="row">
        @using (Html.BeginForm("DosyaYukle", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            <label for="file">Dosya Yükle</label>
            <input type="file" name="file" />
            <input type="submit" value="Yükle" />
        }
    </div>
</div>

 

Layout.cshtml

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title</title>
    <style type="text/css">
        *{
            margin:0 auto;
        }

        #anaDiv{
            width:25%;
            height:auto;
        }

        .row{
            width:100%;
            min-height:75px;
            background-color:#808080;
            margin-bottom:20px;
            padding:10px;
        }

            .row resim {
                width: 30%;
                height: 150px;
            }

            img{
                width:100%;
                height:auto;
            }

        label{
            font-size:20px;
            font-weight:bold;
            color:#fff;
            border-bottom:1px solid #fff;
        }

        input[type="file"]{
            margin-top:10px;
            width:75%;
            background-color:#fff;
        }
        input[type="submit"] {
            width: 23%;
            background-color: #474847;
            color:#fff;
        }
    </style>
</head>
<body>
    <div>
        @RenderBody()
    </div>
</body>
</html>

 

Şimdi controller'imize geçelim.'DosyaYukle' adlı action'ımızı yazalım.(Dosyayı seçip yükleye bastığımızda çalışacak action)

        [HttpPost]
        public ActionResult DosyaYukle(HttpPostedFileBase file)
        {
            if (file == null)
            {
                Response.Write("<script>alert('Bir hatayla karşılaşıldı!')</script>");
                return RedirectToAction("Index");
            }

            var resimAdlari = DB.Resimler.Select(x => x.Ad).ToList();
            var dosyaAd = Path.GetFileName(file.FileName);
            dosyaAd = DosyaKontrol.KarakterSinirla(dosyaAd, 150);
            dosyaAd = DosyaKontrol.KarekterKontrol(resimAdlari, dosyaAd, "/Content/");

            try
            {
                string yol = Path.Combine(Server.MapPath("~/Content"), dosyaAd);
                file.SaveAs(yol);

                Resim resim = new Resim { Ad = "/Content/" + dosyaAd };
                DB.Resimler.Add(resim);
                var kaydedildimi = DB.SaveChanges();
                if (kaydedildimi == 1)
                {
                    Response.Write("<script>alert('Başarıyla Kaydedildi!')</script>");
                }
                else
                {
                    if (System.IO.File.Exists(Server.MapPath(dosyaAd)))
                        System.IO.File.Delete(Server.MapPath(dosyaAd));
                    Response.Write("<script>alert('Dosya bir nedenden dolayı kaydedilemedi!')</script>");
                }
                return RedirectToAction("Index");
            }
            catch (System.Exception ex)
            {
                Response.Write("<script>alert('Bir hatayla Karşılaşıldı!" + ex.ToString() + "')</script>");
                return RedirectToAction("Index");
            }
        }

Bu kodlar içersinde dosyanın karakter uzunluğu sınırı aşmış mı diye ve klasörde aynı isimde bulunan dosya var mı diye kontrol ettim.

DosyaKontrol Sınıfı

using System;
using System.Collections.Generic;

namespace DosyaYuklemeMvc.HelperClass
{
    public class DosyaKontrol
    {
        public static string KarakterSinirla(string resimAd,int sinir)
        {
            var fark = 0;
            if (resimAd.Length > sinir)
            {
                fark = resimAd.Length - sinir;
                resimAd = resimAd.Remove(0, fark);
            }
            return resimAd;
        }

        public static string KarekterKontrol(List<string> resimAdlari, string resimAd,string yol)
        {
            bool durum = true;
            var karakterler = "ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyz0123456789";
            Random rndm = new Random();
            while (durum)
            {
                durum = false;
                foreach (var item in resimAdlari)
                {
                    if (yol + resimAd == item)
                    {
                        var rndmKrkter = rndm.Next(0,karakterler.Length);
                        resimAd = resimAd.Remove(0, 1);
                        resimAd = resimAd.Insert(resimAd.LastIndexOf('.'), karakterler.Substring(rndmKrkter,1));
                        durum = true;
                        break;
                    }
                }
            }
            return resimAd;
        }
    }
}

Burdaki amaç klasörde aynı ada sahip bir dosya mevcutsa, resim adının ilk karakterini siliyor ve resim adının son karakterine rastgele bir karakter ekliyor.Eğer resim adı hala klasördeki adlarla çakışıyor ise tekrar aynı işlemi yapıyor, taa ki resim adının klasörde bulunmadığı belirleninceye kadar.Sonrasında ismi return ediyor, klasöre kaydediyor ve ardından veritabanına kayıt işlemini gerçekleştiriyoruz.(Burada farklı bir algoritmada kullanabilirsiniz.Örnek olarak dosya isminin sonuna karakter eklersiniz.Sonra kontrol edersiniz.)

Şimdi veritabanından verileri çekelim ve resimleri sayfada listeleyelim.

public class HomeController : Controller
{
    Context DB = null;
    public HomeController()
    {
        DB = new Context();
    }

    public ActionResult Index()
    {
        var resimler = DB.Resimler.ToList();
        return View(resimler);
    }
}

Index.cs

@{
    ViewBag.Title = "Dosya Yükle";
}
@using DosyaYuklemeMvc.Models.Table
@model List<Resim>

<div id="anaDiv">
    <div class="row">
        @using (Html.BeginForm("DosyaYukle", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            <label for="file">Dosya Yükle</label>
            <input type="file" name="file" />
            <input type="submit" value="Yükle" />
        }
    </div>
    <div class="row" style="height:auto;">
        <label for="file">Dosyalar</label>
        @foreach (var item in Model)
            {
                <div class="resim">
                    <img src="@item.Ad" />
                </div>
            }
    </div>
</div>

Asp.Net Mvc'de Kontrollü Dosya Yükleme ve Silme İşlemi

 

Şimdi dosya silme işlemine geçelim.

Controller'ımızda 'DosyaSil' adlı action'ımızı oluşturalım.

public ActionResult DosyaSil(int id)
{
    var dosya = DB.Resimler.FirstOrDefault(x => x.Id == id);
    var dosyaAd = dosya.Ad;
    DB.Resimler.Remove(dosya);
    var durum =  DB.SaveChanges();
    if (durum == 1)
    {
        if (System.IO.File.Exists(Server.MapPath(dosyaAd)))
            System.IO.File.Delete(Server.MapPath(dosyaAd));
            Response.Write("<script>alert('Silme işlemi başarıyla gerçekleşti!')</script>");
        }
        else Response.Write("<script>alert('Bir hatayla Karşılaşıldı!')</script>");
            return RedirectToAction("Index");
        }
    }
}

Index.cs

@{
    ViewBag.Title = "Dosya Yükle";
}
@using DosyaYuklemeMvc.Models.Table
@model List<Resim>

<div id="anaDiv">
    <div class="row">
        @using (Html.BeginForm("DosyaYukle", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            <label for="file">Dosya Yükle</label>
            <input type="file" name="file" />
            <input type="submit" value="Yükle" />
        }
    </div>
    <div class="row" style="height:auto;">
        <label for="file">Dosyalar</label>
        @foreach (var item in Model)
            {
            using (Html.BeginForm("DosyaSil", "Home", new { item.Id }))
            {
                <div class="resim">
                    <img src="@item.Ad" />
                </div>
                <br />
                <input type="submit" value="Sil" />
            }
        }
    </div>
</div>

Asp.Net Mvc'de Kontrollü Dosya Yükleme ve Silme İşlemi

 

DosyaKontrol sınıfında farklı işlemler yaparak geliştirebilirsiniz.Dosya ekleme,silme ve listeleme işlemi bu şekilde arkadaşlar.İyi kodlamalar.

İNDİR


Etiketler:  
mvc
aspnet
dosya-yukleme
dosya-silme
dosya-upload-etme


Paylaş:  

Bir Cevap Yazın

E

Elif 7 Ekim 2017
Elinize sağlık, çok teşekkürler

İbrahim Çakal 7 Ekim 2017
Ben teşekkür ederim :)