Makale Özeti

Bu makalemde, asp.net projelerinde windows media player yardımıyla video gösterimi, videonun veritabanına kayıt edilmesi konusunda bilgiler paylaşıyor olacağım.

Makale

Bu makalemde, asp.net projelerinde windows media player yardımıyla video gösterimi, videonun veritabanına kayıt edilmesi konusunda bilgiler paylaşıyor olacağım.

Günümüzde sosyal paylaşım siteleri, haber portalları başta olmak üzere bir çok web uygulamasında videolar bulunduruyor. Web hizmetleri konusunda, video işlemleri başlı başına bir sektörel alan haline geldi. Mesela yazılım geliştiriciler tarafından, video dönüştürme işlemleri için kütüphaneler(.dll) geliştiriliyor. Bu nedenle bir web uygulaması geliştirirken video işlemlerine aşina olmamız, temel bilgilere sahip olmamız biz yazılım geliştiricilerin yararına olduğu kanısındayım.

Video işlemlerini gerçekleştirmek için yeni bir asp.net projesi oluşturuyorum. Bu uygulamanın iletişime geçeceği, videoların kayıtlarının tutulacağı bir veritabanı da oluşturuyorum. Oluşturduğum veri tabanına videolar ile ilgili bilgileri saklayacağım bir tablo oluşturuyorum. Veritabanının adını
videoupload, tablo adını da video olarak tanımlıyorum.



Video tablosunun içeriği yukarıdaki gibidir. Bu tabloda belirtmem gereken bir detay daha var; ID sütununa Identity özelliğini de veriyorum. Bu şekilde kayıtların ID değerleri otomatik olarak belirlenecek. Veritabanı ile ilgili işlemler bukadar. Şimdi oluşturduğum web projeme
VideoGoster.aspx ve VideoYukle.aspx adında iki webform ekliyorum.

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Video Yükleme Sayfası</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <table cellpadding="2" cellspacing="0" style="width: 300px">

            <tr>

                <td style="width: 230px">

                    <asp:FileUpload ID="fileUpVideo" runat="server" />

                </td>

                <td>

                    <asp:Button ID="btnYukle" runat="server" Text="Yükle" Width="60px"

                        onclick="btnYukle_Click" />

                </td>

            </tr>

            <tr>

                <td style="width: 230px">

                    <asp:Label ID="lblSonuc" runat="server"></asp:Label>

                </td>

                <td>

                     

                </td>

            </tr>

        </table>

    </div>

    </form>

</body>

</html>


VideoYukle.aspx webformuna, kullanıcıları dosya seçebilmesi için bir FileUpload kontrolü, seçili dosyanın yüklenebilmesi için bir Button kontrolü ve kullanıcıya mesaj göstermek amacıyla da bir Label kontrolü ekliyorum. Video yükleme aşamasında, kullanıcı önce yükleyeceği video dosyasını seçer, Yükle butonuna tıkladığında video dosyasının sunucuya yüklenmesi denenir. Eğer video yükleme işlemi başarılıysa, kullanıcıya işlemin başarılı olduğunu belirten bir mesaj; eğer yükleme işlemi sırasında hata oluşursa kullanıcıya hata mesajı gösterilir.

using System.Data.SqlClient;

byte[] buffer;

protected void btnYukle_Click(object sender, EventArgs e)

{

    //seçili dosyanın varlığı kontrolü

    if (fileUpVideo.HasFile != false && fileUpVideo.PostedFile != null)

    {

        //video dosyası kontrolü

        if (fileUpVideo.PostedFile.ContentType != "video/x-ms-wmv")

        {

           lblSonuc.Text = "Lütfen uygun formatta bir video dosyası seçiniz.";

           return;

        }

 

        //bir video dosyası seçildiğinden emin olduktan sonra, dosyayı stream nesnesi olarak alıp byte dizisi olarak veri tabanına kaydediyoruz.

        HttpPostedFile yuklenecekDosya = fileUpVideo.PostedFile;

        buffer = new byte[yuklenecekDosya.ContentLength];

        int okunanDeger = yuklenecekDosya.InputStream.Read(buffer, 0, fileUpVideo.PostedFile.ContentLength);

 

        //byte dizide okunacak değer kontrolü

        if (okunanDeger > 0)

        {

            SqlConnection cn = new SqlConnection("server = .; database = videoupload; Integrated Security = true;");

            SqlCommand cmd = new SqlCommand("insert into Video values (@Video, @Ad, @Boyut)", cn);

            cmd.Parameters.AddWithValue("@Video", buffer);

            cmd.Parameters.AddWithValue("@Ad", fileUpVideo.FileName);

            cmd.Parameters.AddWithValue("@Boyut", yuklenecekDosya.ContentLength);

            try

            {

                cn.Open();

                cmd.ExecuteNonQuery();

                lblSonuc.Text = string.Format("{0} adlı video başarıyla yüklenmiştir.", fileUpVideo.PostedFile.FileName);

            }

            catch (Exception ex)

            {

                lblSonuc.Text = ex.Message.ToString();

            }

        }

    }

    else

    {

        lblSonuc.Text = "Lütfen bir video dosyası seçiniz.";

    }

}


VideoYukle.aspx webformunda bulunan Yükle butonuna tıklandığında yapılacak işlemler yukarıdaki kodlarda belirtilmiştir. Yükleme işlemleri başlamadan önce seçili dosyanın olup olmadığını kontrol ediyoruz. Eğer seçili dosya varsa, dosyanın tipini de kontrol ediyoruz. Bu kontroller güvenlik ve performans açısından önemlidir. Gerekli kontrol işlemleri tamamlandıktan sonra, yüklenmek istenen video dosyasını stream olarak okuyup, okunan byte değerlerini bir byte dizi değişkenine değer olarak atıyoruz. Bu dizi veritabanındaki video tablosunun Video sütununda saklanacak. En son olarak elimizdeki bilgileri tabloya ekliyoruz. Videomuzu veritabanına kaydettik. Kaydettiğimiz videoyu webformunda gösterebilmek için Video sütunundaki değerleri okuyabilmemiz gerekir. Bu nedenle projeme bir Generic Handler ekliyorum:

using System.Data.SqlClient;

 

namespace VideoUpload

{

    /// <summary>

    /// Video Göster sayfasından verilen ID değerinde göre; ilgili kayıtın byte dizisinde tutulan, stream nesnesini yakalayabilmek için kullandığımız handler.

    /// </summary>

    public class VideoHandler : IHttpHandler

    {

 

        public void ProcessRequest(HttpContext context)

        {

            SqlConnection cn = new SqlConnection("server = .; database = videoupload; Integrated Security = true;");

            SqlCommand cmd = new SqlCommand("select * from Video where ID = @ID", cn);

            cmd.Parameters.AddWithValue("@ID", context.Request.QueryString["ID"]);

            try

            {

                cn.Open();

                SqlDataReader dr = cmd.ExecuteReader();

                if (dr.Read())

                {

                    context.Response.BinaryWrite((byte[])dr["Video"]);

                    context.Response.ContentType = dr["Ad"].ToString();

                }

            }

            finally

            {

                cn.Close();

            }

        }

 

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

VideoHandler ile veritabanından istenen kayıtın ID değeri aracılığıyla Video sütunundaki bilgiyi alıp, BinaryWrite metodu ile stream olarak elde ediyorum. Bu şekilde veritabanındaki varbinary türündeki bilgiyi kullanabileceğim stream nesnesine dönüştürüyorum.

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Video İzleme Sayfası</title>

</head>

<body>

    <form id="form1" runat="server">

    <div style="width:500px;">

        <asp:TextBox ID="txtID" runat="server" Width="150px"></asp:TextBox>

        <asp:Button ID="btnVideoGoster" runat="server" Text="Video Göster"

            onclick="btnVideoGoster_Click"/>

        <br />

        <asp:Repeater ID="Repeater1" runat="server">

            <ItemTemplate>

                <object id="player" classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6" height="170"

                    width="300">

                    <param name="url" value='<%# "VideoHandler.ashx?ID=" Eval("ID") %>' />

                    <param name="showcontrols" value="true" />

                    <param name="autostart" value="true" />

                </object>

            </ItemTemplate>

        </asp:Repeater>

    </div>

    </form>

</body>

</html>

Veritabanına kaydettiğimiz videoları gösterebilmek için, VideoGoster.aspx sayfasına bir TextBox, bir Button son olarak da data kontrollerinden Repeater nesnesi ekliyorum. Repeater nesnesini biraz incelersek ItemTemplate olarak bir windows media player nesnesi bulunuyor. Bu nesnenin veritabanındaki videolara ulaşabilmesi için url adlı parametresine, VideoHandler kullanıyoruz ve QueryString aracılığıyla ID değerini gönderiyoruz. Video gösterme işlemi için kullanıcı TextBox kontrolünü kullanarak bir değer girip Video Göster butonuna tıkladığında veritabanında kayıtlı olan video windows media player ile gösterilecek.


using System.Data.SqlClient;

using System.Data;

 

namespace VideoUpload

{

    public partial class VideoGoster : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            if (Page.IsPostBack)

            {

                return;

            }

        }

 

        private DataTable VideoGetir(object i)

        {

            //istenen videonun id bilgisi TextBox kontrolünden alınacak.

            SqlConnection cn = new SqlConnection("server = .; database = videoupload; Integrated Security = true;");

            SqlCommand cmd = new SqlCommand("select * from Video where ID = @ID", cn);

            cmd.Parameters.AddWithValue("@ID", (int)i);

            SqlDataAdapter da = new SqlDataAdapter(cmd);

            DataTable tablo = new DataTable();

            da.Fill(tablo);

            return tablo;

        }

 

        protected void btnVideoGoster_Click(object sender, EventArgs e)

        {

            //VideoGetir metoduna parametre olarak id değerini veriyorum.

            //Repeater1 kontrolünün datasource özelliği değerini, metodun döndürdüğü DataTable nesnesinden alacak.

            Repeater1.DataSource = VideoGetir(int.Parse(txtID.Text.Trim()));

            Repeater1.DataBind();

        }

    }

}


Son olarak ufak bir web.config ayarından da bahsetmek istiyorum. Video yükleme işlemi sırasında bir hata almamak için, yüklenecek dosyaların büyüklüğünü(mb) ve yükleme işleminin zaman aşımını(saniye) aşağıdaki kod blogunu kullanarak bildirmemiz gerekiyor:


<httpRuntime maxRequestLength="51200" executionTimeout="600"/>


Böylece bir video dosyasını sunucuya taşımadan veri tabanında saklayıp istenildiği zaman kullanıcıya gösterebilecek bir uygulama geliştirmiş olduk. Anlattıklarımın faydalı olması dileğiyle...


Emir Erdoğdu
www.emirerdogdu.com
Geliştirilen örnek projenin dosyalarıdır.