C# - Executando arquivos de áudio e vídeo do SQL Server no Windows Forms - I


 Neste artigo vou mostrar como executar arquivos de áudio e de vídeo em uma aplicação Windows Forms usando a linguagem C#.

O projeto criado neste artigo irá implementar as seguintes funcionalidades:
  • Criar um banco de dados para armazenar arquivos de áudio e vídeo;

  • Selecionar arquivos de áudio e vídeo usando o OpenFiledDialog;

  • Compactar e armazenar esses arquivos na tabela Midias do banco de dado Cadastro.mdf;

  • Preencher um combobox com os arquivos armazenados no banco de dados;

  • Selecionar o nome de um arquivo na combobox, descompactar o respectivo arquivo armazenado e executá-lo usando o Windows Media Player;

Os arquivos de áudio e vídeo serão armazenados na tabela Midias no banco de dados Cadastro.mdf que possui a seguinte estrutura:

CREATE TABLE [dbo].[Midias](
	[FileId] [uniqueidentifier] NOT NULL,
	[FileName] [nchar](500) NOT NULL,
	[FileData] [varbinary](max) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

 

Vamos utilizar o componente COM - Windows Media Player para executar os arquivos.

Vamos usar também a biblioteca ICSharpCode.SharpZipLib no projeto via Nuget para poder compactar e descompactar os arquivos de áudio e vídeo.

Vamos então ao projeto...

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome CSharp_ArquivosVideos;

No formulário padrão Form1.cs inclua os controles :

  • 1 Label

  • 1 Combobox - cboArquivos

  • 2  Buttons - btnEnviar, btnExecutar

  • 1 Windows Media Player - wpm1

  • 1 OpenFileDialog - ofd1

Incluindo o componente Windows Media Player

Abra a ToolBox e clique com o botão direito sobre a ToolBox e clique em Choose Items...;

Selecione a guia COM Components e marque o item Windows Media Player;

Clique no botão OK;

Disponha os controles conforme o leiaute da figura abaixo:

Incluindo a biblioteca ICSharpCode.SharpZipLib 

No menu Tools clique em Nuget Package Manager e a seguir em Manage Nuget Package for Solution;

Clique em Browse e informe icsharpcode e selecione o pacote ICSharpCode.SharpZipLib.dll e instale-a no projeto;

Selecionando, compactando e armazenando arquivos no SQL Server

Abra o formulário Form1.cs e inclua as seguintes declarações de namespace:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;

Agora vamos criar o método ConnectionString para retornar a string de conexão com o banco de dados cadastro.mdf:

   public string ConnectionString
   {
         get { return "Data Source=.;Initial Catalog=Cadastro;Integrated Security=True"; }
   }

No evento Load do formulário vamos chamar o método CarregaCombo() que irá preencher a combobox com os dados da tabela Midias:

      private void Form1_Load(object sender, EventArgs e)
       {
            CarregaCombo();
       }

Abaixo temos o método CarregaCombo() que acessa a tabela Midias e preenche o combobox:

       private void CarregaCombo()
        {
            try
            {
                String Consulta = "SELECT FileId, FileName FROM Midias";
                SqlDataAdapter adapter = new SqlDataAdapter(Consulta, ConnectionString);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "Midias");
                cboArquivos.DataSource = ds.Tables[0];
                cboArquivos.DisplayMember = "FileName";
                cboArquivos.ValueMember = "FileId";
                cboArquivos.SelectedIndex = 0;
            }
            catch (Exception)
            {
                throw;
            }
       }

Agora vamos criar o método GetArquivo() para obter o nome do arquivo selecionando pelo usuário via janela de diálogo OpenFileDialog - ofd1:

       private string GetArquivo()
        {
            try
            {
                ofd1.Filter = "Arquivos (*.*)|*.*";
                ofd1.Multiselect = true;
                if (ofd1.ShowDialog() == DialogResult.OK)
                {
                    return ofd1.FileName;
                }
            }
            catch (Exception)
            {
                throw;
            }
            return string.Empty;
        }

Precisamos criar o método SalvarNoBancoDados() que vai salvar o nome do arquivo selecionado e o seu conteúdo compactado na tabela Midias :

          private bool SalvarNoBancoDados(string nomeArquivo, byte[] dados)
        {
            try
            {
                var ds = new DataSet();
                SqlCommand cmd = new SqlCommand("insert into Midias values('" + Guid.NewGuid() + "','" + nomeArquivo + "',@content)");
                SqlParameter param = cmd.Parameters.Add("@content", SqlDbType.VarBinary);
                param.Value = dados;
                cmd.Connection = new SqlConnection(ConnectionString);
                cmd.CommandTimeout = 0;
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception)
            {
                throw;
            }
        }

Para compactar o arquivo selecionado vamos usar o método ObterArquivoCompactado() que compacta o arquivo selecionado:

        public static byte[] ObterArquivoCompactado(string nomeArquivo, byte[] valor)
        {
            try
            {
                // compactar arquivo - zip
                if (valor != null && !string.IsNullOrEmpty(nomeArquivo))
                    using (var zippedMemoryStream = new MemoryStream())
                    {
                        // ZIP stream
                        using (var zipOutputStream = new ZipOutputStream(zippedMemoryStream))
                        {
                            zipOutputStream.SetLevel(9);

                            var entry = new ZipEntry(nomeArquivo) { DateTime = DateTime.Now };
                            zipOutputStream.PutNextEntry(entry);

                            zipOutputStream.Write(valor, 0, ConvertToInt32(valor.Length));

                            zipOutputStream.Finish();
                            zipOutputStream.Close();

                            return zippedMemoryStream.ToArray();
                        }
                    }
            }
            catch (Exception)
            {
                return valor;
            }
            return null;
        }

Precisamos também converter o arquivo selecionado para bytes usando o método ConverterArquivoParaBytes(arquivo) que será usado pelo método SalvarNoBancoDados();

        private static byte[] ConverterArquivoParaBytes(string nomeArquivoOrigem)
        {
            BinaryReader leitorBinary = null;
            if (!File.Exists(nomeArquivoOrigem))
                return null;

            try
            {
                leitorBinary = new BinaryReader(new FileStream(nomeArquivoOrigem, FileMode.Open, FileAccess.Read));
                return leitorBinary.ReadBytes(ConvertToInt32(leitorBinary.BaseStream.Length));
            }
            finally
            {
                if (null != leitorBinary)
                   leitorBinary.Close();
            }
        }

Agora podemos definir o código do evento Click do botão - Selecionar Arquivo e Salvar - conforme abaixo:

       private void btnEnviar_Click(object sender, EventArgs e)
        {
            var arquivo = GetArquivo();
            var lista = new string[] { ".mp3", ".avi", ".mp4", ".wmv" };
            if (!lista.Contains(Path.GetExtension(arquivo)))
            {
                MessageBox.Show("Selecione um arquivo");
            }
            else
            {
                var resultado = SalvarNoBancoDados(Path.GetFileName(arquivo), ObterArquivoCompactado(arquivo, ConverterArquivoParaBytes(arquivo)));
                if (resultado)
                {
                    cboArquivos.Items.Add(Path.GetFileName(arquivo));
                    MessageBox.Show("Arquivo Salvo com sucesso !!");
                }
            }
      }

Neste momento já temos todas as funcionalidades que permitem selecionar um arquivo, salvar o nome do arquivo e seu conteúdo comprimido no banco de dados.

Executando o projeto neste momento e clicando no botão Selecionar Arquivo e Salvar veremos a caixa de diálogo abrir arquivo onde podemo selecionar um arquivo que será salvo na tabela Midias:

Na segunda parte do artigo vamos concluir o projeto implementando a execução do arquivo selecionado no Windows Media Player.

(Disse Jesus) "Se vós estiverdes em mim, e as minhas palavras estiverem em vós, pedireis tudo o que quiserdes, e vos será feito. "
João 15:7

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti