ASP.NET Web Api 2 İle Dosya Yükleme(File Upload) İşlemi

Bu makalemizde ASP.NET Form, ASP.NET MVC, ASP.NET Web Api 1 sürümlerinde yaptığımız file upload işleminin ASP.NET Web Api 2’de nasıl yapılabildiğini güzel bir örnek ile göreceğiz.

ASP.NET Web Api 2 İle Dosya Yükleme(File Upload) İşlemi

ASP.NET Web Api 2 İle Dosya Yükleme(File Upload) İşlemi

Özet açıklama kısmında “ASP.NET Form, ASP.NET MVC, ASP.NET Web Api 1 sürümlerinde yaptığımız file upload işleminin ASP.NET Web Api 2’de nasıl yapılabildiğini…”  gibi bir cümle kurduğumuzu farketmiş olmalısınız bunun nedenide ASP.NET Web Api 2 hariç diğer saydığım proje tiplerinde upload edilmek istenen dosyalara erişmek için HttpContext.Current.Request.Files şeklinde kolayca erişebiliyorken ASP.NET Web Api 2’de bu kadar kolay olmayabiliyor çokda zor değil ama alışkanlıklardan kolay kolay vazgeçilmediği için buda ne diyebilirsiniz 🙂 Fakat bu cümleyi kurmamak adına örneği güzel bir şekilde yapabilmeyi umut ediyorum.

Şimdi hızlıca örneğimize geçelim kurgumuz oldukça basit olacak Html tarafındaki bir form ile Web Api 2 Controller’imizdaki Action’a dosyaları POST edeceğiz ve Action içerisinde ilgili dosyaları yakalayıp Bu yakaladığımız dosyaların bilgilerinden oluşmuş sonucu kullanıcıya çıktı olarak vereceğiz.

Öncelikle ASP.NET Web Api 2 Controlleri oluşturuyoruz ve içeriğini alttaki gibi dolduruyoruz.

En baştan aşağı doğru kodumuzu açıklayalım RoutePrefix attribute’ü ile api/fileupload şeklinde ulaşmamız gereken controller‘a api/test şeklinde güncellemiş oluyoruz ve Route attribute’ü ilede UploadSingleFile

action’ına files olarak ulaşmayı sağlıyoruz böylelikle her iki attribute sonucunda projemiz içerisinde action‘a şu şekilde ulaşacağız api/test/files. HttpPost attribute’ü zaten standart olarak kullandığımız veri iletim metodunu belirtiyoruz. Burada ValiDateMimeMultipartContenFilter adında bir Attribute var bunu kendimiz oluşturduk Attribute içerisindeki 2 satır kodu UploadSingleFile adlı metod içerisindede kullanabilirdik fakat farklı bir Action‘da kullanmak istersek aynı tanımlamayı tekrar yapmayalım diye ActionFilterAttribute olarak tanımladık. ValidateMimeMultipartContentFilterAttribute adındaki attribute kodlarına bir alttaki kod

bloğundan gözatabilirsiniz. Metodumuzun tanımına baktığımızda asenktron bir metod olduğunu görüyoruz. Şimdide UploadSingleFile adlı metod içerisine gözatalım MultipartMemoryStreamProvider sınıfı ile Request’deki tüm MultiPart içerikleri okuyor olacağız yaptığınız isteğin okunabilmesi için html form etiketine enctype=”multipart/form-data” tanımını yapmış olmalısınız. Bu html alttaki satırlarda gözatacağız. MultiPart içeriklerini okuduktan sonra tüm içeriklere stremProvider.Contents nesnesi üzerinden ulaşabiliyor olacağız. Bundan sonraki satırlar makale konusu kapsamında olmadığı için yani standart Where,Select, ToArray v.b işlemler olduğundan makaleyi daha fazla uzatıp sıkmak istemiyorum ama belkide es geçilemeyecek bir konu var bundan sonraki satırlar içerisinde oda description.ReadAsStringAsync() satırıdır okunan içeriklerin bir liste olarak streamProvider.Contents adlı nesnesi üzerinde barındığını söylemiştik bu nesne içerisinden ContentDisposition.Name’i “description” olan yani aslında bizim html tarafındaki input[type=text] türünden nesnemize ait oluşturulmuş bir içeriktir bu içeriğin html barındırdığını bildiğimizde ReadAsStringAsync diyerek stream’den string’e çevirmini sağlıyoruz bu şekilde farklı yardımcı metodlar ile içeriklerinizi dosya olarak oluşturabilir üzerinde işlemler yapabilirsiniz.

ValidateMimeMultipartContentFilterAttribute adlı Attribute‘e ait kodlara gözatacağımızı daha önce söylemiştik. Burada pek anlatılacak bir durum yok açıkçası ama kısaca özetleyelim ActionExecuting edileceği zaman yapılan isteğin MultiPart bir içeriğe sahip olunup olunmadığı kontrol ediliyor daha önce bunun uyarısını yapmıştık bu durum gözardı edilirse exception almanız olası bir durumdur. Eğer istek MultiPark bir içerik değil ise DesteklenmeyenMedyaTürü diye bir ResponseException’ı fırlatılıyor.

Metodun geri dönüş tipi olan FileResult sınıfının tanımlandığı FileResult.cs adlı dosyanın içeriğini görelim.

Şimdide html tarafında Action’ımıza isteği yapacak form’umuza gözatalım.

Form’da unutulmaması gereken muhteşem üçlü var 🙂 buda action, method ve enctype attribute’leridir. Tabi bu isteği oluşturacak input[type=submit] html elementimizde olmazsa olmazlardan. Yapılacak bu isteğin içerisinde sonuç olarak bir input[name=description] ve seçili dosya kadar input[type=file] nesnesi için içerikler istek parametrelerine eklenecektir.

Şimdi html formumuzun görünümüne ve yaptığımız istek sonrası bize dönen sonuca bakalım.

Gönder dediğimizde FileUploadController adlı ApiController‘i içerisinde kodlar işlendikten sonra FileResult tipinde çıktı alıyoruz Google Chrome‘da xml olarak sonuç aldığımızı göreceksiniz.

[fa class=”fa-github”] Makaledeki örneğimize buradaki github repository adresinden ulaşabilirsiniz.

Başka bir makalede görüşmek dileğiyle 🙂

Bir Cevap Yazın