ASP.NET MVC ile Dosya Yükleme

günü tarafından yayınlandı.

Dosya yükleme bir çok uygulamada gerekmektedir. Aşağıdaki kodlar ASP.NET MVC ortamı için hazırlanmış en basit yöntemi göstermektedir. Ayrıca yüklediğiniz dizindeki tüm dosyaları gösteren bir kod parçası da mevcuttur.

Boş bir ASP.NET MVC projesi oluşturduktan sonra Views klasörü altına Home klasörünü ekliyoruz. Home içerisine de Index.cshtml adında bir sayfa oluşturduktan sonra şu kodları yazıyoruz;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<h2>FileUpper</h2>

<form action="/Home/Index" method="post" enctype="multipart/form-data">
 <label for="desc">Description:</label>
 <input type="text" name="desc" id="desc" />
 <br />
 <label for="file1">Filename:</label>
 <input type="file" name="files" id="file1" />
 <br />
 <input type="submit"  />
</form>

@if (TempData["files"] != null)
{
 <ul>
  @foreach (string file in (string[])TempData["files"])
  {
   <li>@file</li>
  }
 </ul>
}

Daha sonra Controllers klasörü altında HomeController oluşturduktan sonra aşağıdaki kodları ekliyoruz. Daha önceden bir Index fonksiyonu varsa çakışmaması için onu silebilirsiniz. Ayrıca referanslara using System.IO; eklemeniz gerekebilir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public ActionResult Index()
{
 string[] files = Directory.GetFiles(Server.MapPath("~/App_Data/uploads"));
 string[] fileNames = new string[files.Count()];
 for (int i = 0; i < files.Count(); i++)
 {
  fileNames[i] = files[i].Substring(files[i].IndexOf("uploads"));
 }
 TempData["files"] = fileNames;
 return View();
}

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files, string desc)
{
 foreach (var file in files)
 {
  if (file != null && file.ContentLength > 0)
  {
   var fileName = desc + "_" + Path.GetFileName(file.FileName);
   var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
   file.SaveAs(path);
  }
 }
 return RedirectToAction("Index");
}

Son olarak App_Data klasörü altına uploads klasörünü eklerseniz, siteniz çalışmaya hazırdır. Yüklediğiniz her dosya bu uploads atılacak ve sayfanızın altında listelenecektir. Kodu incelediğinizde post metodunun birden fazla dosya için hazırlandığını görebilirsiniz. Aşağıdaki gibi eklediğiniz her file input işlemden geçecek ve belirtilen dizine kayıt edilecektir.

1
<label>Filename:</label><input type="file" name="files" />

Dosya yükleme sırasında dizinde aynı isimli dosya mevcut ise hata verecektir bu nedenle dosya ismini değiştirmeniz gerekebilir. Dosya isimleri konusunda en uygun yöntem Guid.NewGuid() ile üreteceğiniz benzersiz bir guid oluşturup, uzantı olarak da bilinmeyen bir uzantı vermektir. Resimlere “.rsm” gibi bir uzantı verebilirsiniz. Eğer dosyanın asıl adı size lazımsa onu yeni adıyla ilişkili olarak veritabanında tutabilirsiniz. Uzantısı farklı olan resim dosyalarının web sayfası üzerinde gösteriminde sorun olmayacaktır.

Bir de yüklenen her dosyayı doğrudan kopyalamak yerine tekrar oluşturmak daha güvenli olacaktır. Resimlerin içine gömülen virüslerden tutun, resmin EXIF etiketlerine yazılabilen kodlarla sitenizi ele geçirebilirler.