Click here to Skip to main content
Click here to Skip to main content

Video Uploader Control for SQL Server

By , 28 Nov 2007
 

Introduction

This article will explain how to upload and insert files into SQL Server (specially audio, video, and image files) using C# and ADO.NET, and then how to show the video file in an ASP.NET page with a player control.

Background

Before we start, I don't know what is better, uploading files to a database or uploading files to a server system and storing only their paths in the database. Well, I think, if those files are small in size (like images), I'd prefer to store them in the database, but if they are large (I don't have a number), then I think this will take time with the stream while reading and writing binary data (I'd like to know about your experience).

Tools

  • Create a table in a SQL Server database that will store the file data, file name, and file size.
  • ID Int
    Video varbinary(MAX)
    Video_Name nvarchar(50)
    Video_Size bigint
  • In the control, add a FileUpload control, a Button, a Label.
  • Add the control to your page.

Using the code

The idea when uploading a file to a database is to convert it to bytes. Converting a file to bytes is easy by getting the HTTPPostedFile and read it with a stream to bytes, then inserting them in a varbinary column in SQL Server (in the case of video or audio files) or an image column (in the case of images).

using System.IO;
using System.Data.SqlClient;

public partial class UploadVideo : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    byte[] buffer;
    //this is the array of bytes which will hold the data (file)

    SqlConnection connection;
    protected void ButtonUpload_Click(object sender, EventArgs e)
    {
        //check the file

        if (FileUpload1.HasFile && FileUpload1.PostedFile != null 
            && FileUpload1.PostedFile.FileName != "")
        {
            HttpPostedFile file = FileUpload1.PostedFile;
            //retrieve the HttpPostedFile object

            buffer = new byte[file.ContentLength];
            int bytesReaded = file.InputStream.Read(buffer, 0, 
                              FileUpload1.PostedFile.ContentLength);
            //the HttpPostedFile has InputStream porperty (using System.IO;)
            //which can read the stream to the buffer object,
            //the first parameter is the array of bytes to store in,
            //the second parameter is the zero index (of specific byte)
            //where to start storing in the buffer,
            //the third parameter is the number of bytes 
            //you want to read (do u care about this?)

            if (bytesReaded > 0)
            {
                try
                {
                    string connectionString = 
                      ConfigurationManager.ConnectionStrings[
                      "uploadConnectionString"].ConnectionString;
                    connection = new SqlConnection(connectionString);
                    SqlCommand cmd = new SqlCommand
                    ("INSERT INTO Videos (Video, Video_Name, Video_Size)" + 
                     " VALUES (@video, @videoName, @videoSize)", connection);
                    cmd.Parameters.Add("@video", 
                        SqlDbType.VarBinary, buffer.Length).Value = buffer;
                    cmd.Parameters.Add("@videoName", 
                        SqlDbType.NVarChar).Value = FileUpload1.FileName;
                    cmd.Parameters.Add("@videoSize", 
                        SqlDbType.BigInt).Value = file.ContentLength;
                    using (connection)
                    {
                        connection.Open();
                        int i = cmd.ExecuteNonQuery();
                        Label1.Text = "uploaded, " + i.ToString() + " rows affected";
                    }
                }
                catch (Exception ex)
                {
                    Label1.Text = ex.Message.ToString();
                }
            }

        }
        else
        {
            Label1.Text = "Choose a valid video file";
        }
    }
}
//create a sqlcommand object passing the query and the sqlconnection object
//when declaring the parameters you have to be sure 
//you have set the type of video column to varbinary(MAX)

How to select the data and show it on your page

The problem here is that we have to set the src property of the player control, but our file exists in a database, so we need a handler to read the bytes in the database.. The handler idea is awesome! You can call it like: "Handler.ashx?ID=1", and in the handler code, read the video column where the ID column = QueryString["id"].

using System;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;

public class VideoHandler : IHttpHandler 
{
    
    public void ProcessRequest (HttpContext context) 
    {
        string connectionString = 
          ConfigurationManager.ConnectionStrings[
          "uploadConnectionString"].ConnectionString;

        SqlConnection connection = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand("SELECT Video, Video_Name" + 
                         " FROM Videos WHERE ID = @id", connection);
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = 
                           context.Request.QueryString["id"];
        try
        {
            connection.Open();
            SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Default);
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    context.Response.ContentType = reader["Video_Name"].ToString();
                    context.Response.BinaryWrite((byte[])reader["Video"]);
                }
            }
        }
        finally
        {
            connection.Close();
        }
    }
 
    public bool IsReusable 
    {
        get {
            return false;
        }
    }
}

OK.. how do we show the video?! You can show the video in an ASP.NET Data control. Well, I did an example on the Repeater control. You have to read the data from the SQL Server with a SQL adapter and bind the data source to the Repeater control. Well, here you can specify which videos to select in the datasource..

private DataTable GetSpecificVideo(object i)
//pass the id of the video
{
    string connectionString = 
      ConfigurationManager.ConnectionStrings[
      "uploadConnectionString"].ConnectionString;
    SqlDataAdapter adapter = new SqlDataAdapter("SELECT Video, ID " + 
                             "FROM Videos WHERE ID = @id", connectionString);
    adapter.SelectCommand.Parameters.Add("@id", SqlDbType.Int).Value = (int)i;
    DataTable table = new DataTable();
    adapter.Fill(table);
    return table;
}
protected void ButtonShowVideo_Click(object sender, EventArgs e)
{
    Repeater1.DataSource = GetSpecificVideo(2);
    //the video id (2 is example)

    Repeater1.DataBind();
}

Now, its time for the player control.. In the Repeater (source view), add an ItemTemplate, and set the URL value parameter of the player control to <'%# "VideoHandler.ashx?id=" + Eval("ID") %'>. The ID is the name of the ID column of the data source that the Repeater binds to.

<asp:Button ID="ButtonShowVideo" runat="server" 
   onclick="ButtonShowVideo_Click" Text="Show Video" />

    <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>

Hope you found this useful.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Islam ElDemery
Web Developer Business Development Gate
Egypt Egypt
Member

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generalhow to play all videosmemberharikrishnan.vg90221 Feb '12 - 0:14 
help me!
how to play all the videos in asp.net using c#.
and how about audio.
i am new to asp.net.
the above code has no error but it will not work in the firefox. When it browse with IE
it only shows the player.
Thanks
QuestionNot WorkingmemberMember 854266616 Feb '12 - 1:08 
Hello Friends,
 
I had download whole source. but i can`t see the video.
so can any one help me?
 
Thanks
Questiongreat....memberRajesh Biswas7 Dec '11 - 19:28 
thanks it's great........
AnswerRe: great....membersaracena8 Mar '12 - 0:17 
its working ha how u telling great nu if u worked u sing this na send that file with database am check that..........
GeneralRe: great....memberRajesh Biswas3 Jul '12 - 19:21 
i told this becouse i got idea from here only and mine code is working fine.
AnswerRe: great....memberAVINCODE13 Mar '13 - 22:12 
Hi Rajesh,
 
Can U share ur code ?
 
Thanks,
Avinash
AVINCODE

Questionnot working on mozila firefoxmemberMember 822941316 Oct '11 - 20:25 
This post(Video Uploader Control for SQL Server by Islam ElDemery) is only working on IE but not in mozila firefox.
So plese tell me how above post will work on mozila firefox.
thanks.
QuestionNOT WORKINGmemberarchana jain13 Oct '11 - 23:56 
I try to upload 100_0059.mov file , click on Upload button but nothing is happening .
 
It is not entering into Click event of Upload button.
 
Please help me out..and please never post such blogs before testing properly.
AnswerRe: NOT WORKINGmemberMember 822941316 Oct '11 - 20:30 

 
Add abobe code in your web.config file inside ADD ABOVE CODE,i think it will work fine.
QuestionVery WorstmemberAmericanGopi7 Aug '11 - 21:58 
your Project is not working i don't know how code project team was allowed this......

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 28 Nov 2007
Article Copyright 2007 by Islam ElDemery
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid