Asp.net mvc dosya yükleme (file upload)

13 Ocak 2016 4 dk okuma süresi 47 okunma

Mvc'de birçok kişi dosya yükleme kısmında sorun yaşıyor. Bunu aşmak için 2 kolay yöntem var. Birisi klasik fileupload ile Request.Files diğeri ise System.Web.HttpPostedFileBase. Aşağıdaki örneklerde ikisini de görebilirsiniz. Burada en önemli nokta form üzerinde enctype özelliğinin olması.


Klasik Request.Files yöntemi ile dosya yükleme

@using (Html.BeginForm("Upload", "FileUpload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="uploadingFiles" />
    <input type="submit" value="Upload file" />
}


Controller tarafında ise şu şekilde karşılıyoruz. Herhangi bir attribute kullanmamıza gerek yok. Çünkü Request ile işlem yapacağız.

public ActionResult Upload()
{
    if (Request.Files.Count > 0)
    {
        var file = Request.Files[0];
        if (file != null && file.ContentLength > 0)
        {
            // burada dilerseniz dosya tipine gore filtreleme yaparak sadece istediginiz dosya formatindaki dosyalari yukleyebilirsiniz
            //if (file.ContentType == "image/jpeg" || file.ContentType == "image/jpg" || file.ContentType == "image/png" || file.ContentType == "image/gif")
            //{
                var fi = new FileInfo(file.FileName);
                var fileName = Path.GetFileName(file.FileName);
                fileName = Guid.NewGuid().ToString() + fi.Extension;
                var path = Path.Combine(Server.MapPath("~/files/"), fileName);
                file.SaveAs(path);
            //}
        }
    }

    return View();
}


System.Web.HttpPostedFileBase yöntemi ile dosya yükleme

View yine yukarıdaki ile aynısı. Dikkat ederseniz file input'unda name kısmı boş değil. Burasını zaten hiçbir zaman boş bırakmamanızı tavsiye ediyorum. Controller tarafında bu name üzerinden erişim sağlıyoruz.

[HttpPost]
public ActionResult Upload(System.Web.HttpPostedFileBase uploadingFiles)
{
    if (file != null && file.ContentLength > 0) 
    {
        // yukleme islemleri
    }
    
    return View();
}


Birden fazla dosya yükleme (mvc multiple file upload)

File input'a multiple özelliğini ekliyoruz ve controller kısmında bu sefer tek HttpPostedFileBase yerine IEnumerable<HttpPostedFileBase> olmalı.

@using (Html.BeginForm("Upload", "FileUpload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="uploadingFiles" multiple />
    <input type="submit" value="Upload file" />
}
[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> uploadingFiles)
{
    foreach (var file in files)
    {
        if (file != null && file.ContentLength > 0)
        {
            // dosya yukleme islemleri
        }
    }
    
    return View();
}
Yazılarıma abone olmak ister misiniz?
Spam yapılmaz, sadece bildirim amaçlıdır. İstediğiniz zaman abonelikten çıkabilirsiniz.
İlginizi çekebilecek diğer yazılar.
VS2015'in 3. update'ini yaptıktan sonra asp.net core web uygulaması yaratmak istediğimde şu şekilde bir hata ile karşılaştım. "Exception : The system cannot find the file specified. (Exception from HRESULT: 0x80070002)". Çözümü oldukça basit.

Entity framework code first kullanıyorsanız ve inheritance yapıp yeni bir class yarattığınızda bunun gibi bir hata alırsınız. Bunun nedeni fluent api'nin inheritance yapılan class ile ana class'ın map yapmaya çalışması ve ilgili kolonu veritabanında bulamamasıdır. Çözümü ise inherit olmuş class'a [NotMapped] DataAnnotations attribute'unu eklemek.

Asp.Net Mvc ile recursive nasıl yazılır, @helper veya HtmlHelper kullanarak recursive fonksiyon yazmak, Asp.Net MVC View recursive fonksiyon nasıl yazılır?