Hack x Crack - Comunidad de Seguridad informática

Programación => Visual Basic => Mensaje iniciado por: Rhema en Mayo 28, 2013, 07:14:43 am

Título: Crear Base de Datos que guarde binarios
Publicado por: Rhema en Mayo 28, 2013, 07:14:43 am
Bueno pues esta es una duda que tengo, la verdad es que debo hacer un programa que me guarde el codigo binario de un archivo en una BD y que con ese mismo programa pueda ver o abrir el archivo en el mismo codigo binario y tambien como se deberia abrir normalemente(es decir si es mp3 como mp3, si es docuemento como documento, etc.) y pues la verdad si estoy medio perdido, bueno de antemano, gracias y saludos!
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: ravenheart en Mayo 28, 2013, 11:07:14 am
Para guardar binarios en BD tienes el tipo BLOB normalmente.
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Prow en Mayo 28, 2013, 01:45:55 pm
Amigo, creo que por lo menos debes decirnos que base de datos usas.
Como dice ravenheart por lo general el campo suele llamarse "BLOB", "BINARY", "VARBINARY", etc...
Pero deberías decirnos tu DB específicamente... Creo que por aqui tengo algo para SQL Server y VB.NET
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: @NetFcruz en Mayo 28, 2013, 05:24:28 pm
Hola amigo Rhema, los companeros tienen razon, que tipo de BD usas, y entendi que quieres guardar cualquier archivo?, mp3, imagen, docuemntos cierto. Pues Blob para imagenes, mp3 puede ser string, es decir te recomiendo guardar solo la ruta de acceso al mp3.
Por dos opciones, una es el peso de la BD, no importaria si tienes 10 o 20 mp3 pero si son muchos te va dar dolores de cabeza.
Segunda es la velocidad se descarga, es mas rapido con solo el acceso al archivo que intentar consultar directamente desde la base de datos. A no ser que tengas un buen motivo para hacerlo.
Saludos.

Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Rhema en Mayo 28, 2013, 07:28:39 pm
Bueno muchisimas gracias a todos y disculpen por no especificar tanto.. jeje es que hice el post ayer en plena frustacion y desvelo.. jeje

Bueno la BD la estoy trabajndo en Sql Server  y .Net claro esta, y bueno el programa consiste en que cuando yo abra un archivos sea cual sea su extension, automaticamente se me guarde en la BD el codigo "binario" del archivo, y luego que ese codigo pueda ser exportado a otra pc con el mismo programa y que me lo pueda abrir tanto en binario, como el archivo mismo.

Muchisisimas gracias por sus ayudas, me estan ayudando mucho.  :D
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Prow en Mayo 28, 2013, 09:39:19 pm
Investiga como utilizar el objeto IO.MemoryStream.
Deberías poder guardar en ese objeto el mp3 y luego pasarlo a un parámetro de SQL Server.

Código: [Seleccionar]
cmd.Parameters.Add("@mp3", SqlDbType.VarBinary).Value = varMemoryStream.GetBuffer()
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Rhema en Mayo 28, 2013, 10:33:22 pm
Investiga como utilizar el objeto IO.MemoryStream.
Deberías poder guardar en ese objeto el mp3 y luego pasarlo a un parámetro de SQL Server.

Código: [Seleccionar]
cmd.Parameters.Add("@mp3", SqlDbType.VarBinary).Value = varMemoryStream.GetBuffer()

Muchas gracias, crees que con eso(IO.MemoryStream) baste para guardarlo y cargarlo?
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Prow en Mayo 28, 2013, 10:40:20 pm
Investiga como utilizar el objeto IO.MemoryStream.
Deberías poder guardar en ese objeto el mp3 y luego pasarlo a un parámetro de SQL Server.

Código: [Seleccionar]
cmd.Parameters.Add("@mp3", SqlDbType.VarBinary).Value = varMemoryStream.GetBuffer()

Muchas gracias, crees que con eso(IO.MemoryStream) baste para guardarlo y cargarlo?
Para guardarlo si. Para cargarlo supongo que deberás usar alguna clase que te permita reproducirlo, si es lo que quieres..
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Rhema en Mayo 29, 2013, 04:08:23 am
A Perfecto, disculpa crees que me puedas dar algún link de algún ejemplo o ejercicio? es que ando medio perdido aun buscando eso, porque no quiero perder mucho tiempo con ello, bueno muchas gracias men.
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Prow en Mayo 30, 2013, 04:31:25 am
[Solucionado en IRC]

'Guardar archivo en campo VarBinary
cmd.CommandText = "INSERT INTO tabla (name, binario) VALUES (@name, @bytes)"
cmd.Parameters.Add("@name", SqlDbType.NVarchar).Value = "nombre_De_Archivo"
cmd.Parameters.Add("@bytes", SqlDbType.VarBinary).Value = IO.File.GetAllBytes("path_archivo")
cmd.Connection = con
con.Open()
cmd.ExecuteNonQuery()
con.Close()


Saludos!
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Rhema en Mayo 31, 2013, 02:55:23 am
[Solucionado en IRC]

'Guardar archivo en campo VarBinary
cmd.CommandText = "INSERT INTO tabla (name, binario) VALUES (@name, @bytes)"
cmd.Parameters.Add("@name", SqlDbType.NVarchar).Value = "nombre_De_Archivo"
cmd.Parameters.Add("@bytes", SqlDbType.VarBinary).Value = IO.File.GetAllBytes("path_archivo")
cmd.Connection = con
con.Open()
cmd.ExecuteNonQuery()
con.Close()


Saludos!

Asi es , gracias a @NetFCruz y a prow pude solucionarlo jeje

aqui esta el codigo completo en una sub rutina:
Código: [Seleccionar]
Private Sub Basededatos()
        'se declara la variable bytes para convertir el archivo a byte
        Dim bytes() As Byte = IO.File.ReadAllBytes(OpenFileDialog.FileName)
        'la conexion..
        Dim con As SqlClient.SqlConnection = New SqlClient.SqlConnection(cadenaconexion)
        Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand
        'se iguala el command.connection a la conexion
        cmd.Connection = con
        'se abre la conexion
        con.Open()
        'se introducen los datos en las tablas
        cmd.CommandText = "INSERT INTO tbl_principal(nombre, binarios) VALUES (@nombre, @binarios)"
        cmd.Parameters.Add("@nombre", SqlDbType.NVarChar).Value = TXTNombre.Text 'obtiene el dato de un txt
        cmd.Parameters.Add("@binarios", SqlDbType.VarBinary).Value = bytes 'obtiene el dato de la variable byte
        cmd.ExecuteNonQuery()
        con.Close()
    End Sub
 

    Private Sub BtnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBuscar.Click
        'el filtro del OPF para cualquier archivo
        OpenFileDialog.Filter = "*.* | *.*"
        'se ejecuta
        If OpenFileDialog.ShowDialog = DialogResult.OK Then
            Dim modstrnombre As String
            modstrnombre = OpenFileDialog.FileName
            txtruta.Text = OpenFileDialog.FileName
            Basededatos()
        End If
    End Sub
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: ravenheart en Mayo 31, 2013, 09:19:16 am
¿Y cómo lo abres después?
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: @NetFcruz en Mayo 31, 2013, 06:25:50 pm
Bien pongo una subrutina para busqueda de foto y abrirlo y la adaptas.
Código: [Seleccionar]

 'Para Buscar Fotos al cargar el form de la Row Seleccionada
    Sub BuscaFoto()
        Try
            strConexion.subConexON()  'Abre conexion

            Dim Sql As String = "SELECT * FROM tb_transporte WHERE IDUNIDAD=" & Me.txtUnidad.Text & ""
            Dim lector As SqlDataReader


            If strConexion.con.State = ConnectionState.Open Then

                'LEER DE BD SQL Y PASA EL VALOR A LAS VARIABLES
                Dim sqlComando As New SqlCommand(Sql, strConexion.con)
                lector = sqlComando.ExecuteReader
                While lector.Read

                    Imag = CType(lector("FOTO"), Byte())
                    Me.PictureBox1.Image = Bytes_Imagen(Imag)

                End While
            Else
                MsgBox("No se encuentra el la base de datos, Verifiquelo Porfavor")
                'Aqui puedes poner la ruta de una imagen refrencia sin foto o archivo
            End If
            'Cierro conexion - Consulta
            strConexion.subConexOFF()
        Catch ex As Exception
            'Para saber error de busqueda
            MessageBox.Show(ex.Message)
        End Try
    End Sub


Solo adaptalo, puede ser con un Stored Procedure,Saludos. :D


Y Esto es una subrutina para que una vez consultada la imagen puedas extraerla y guardarla en otro directorio.

Código: [Seleccionar]
Sub subExtraeImagen()
        Try
            Dim saveImage As New SaveFileDialog 'Este es el SaveFileDialog
            Dim ruta As String = "" 'Para tener la ruta de la imagen

            saveImage.Title = "Guardar imagen como..." 'Título de la ventana
            saveImage.Filter = "Imagen BMP (*.bmp)|*.bmp|Imagen JPG (*.jpg)|*.jpg|Imagen PNG (*.png)|*.png" 'Los formatos en que se guardará la imagen
            If saveImage.ShowDialog() = Windows.Forms.DialogResult.OK Then
                'Recuperar la ruta de la imagen si no está vacía
                If Not String.IsNullOrEmpty(saveImage.FileName) Then ruta = saveImage.FileName

                Dim myImg As Image 'Objeto Image para guardar la imagen del Picture
                Dim extension As String = ruta.Substring(ruta.Length - 3, 3) 'Recuperar los ultimos 3 caracteres de la extensión

                myImg = PictureBox1.Image 'Guardar la imagen del PictureBox en el objeto Image
                Select Case extension
                    Case "bmp"
                        myImg.Save(ruta, Imaging.ImageFormat.Bmp) 'Guardar en formato BMP
                    Case "jpg"
                        myImg.Save(ruta, Imaging.ImageFormat.Jpeg) 'Guardar en formato JPG
                    Case "png"
                        myImg.Save(ruta, Imaging.ImageFormat.Png) 'Guardar en formato PNG
                End Select
            End If
        Catch ex As Exception
            MsgBox("Ocurrió el siguiente error: " & ex.Message, MsgBoxStyle.Critical, "Informacion - v1.0!")
        End Try

    End Sub
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Prow en Mayo 31, 2013, 07:12:24 pm
Muy bien @NetFcruz

Sólo una cosa. La siguiente consulta es vulnerable a SQLi
Código: [Seleccionar]
"SELECT * FROM tb_transporte WHERE IDUNIDAD=" & Me.txtUnidad.Text & ""
Saludos!

@NetFcruz DICE:
Citar
Si es verdad porque puede filtrar mucho, no es una consulta segura, poden hacerlo con el stored es mas seguro. Ademas del *.
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Rhema en Junio 04, 2013, 09:08:21 am
Una duda, me podrian explicar un poco mas precisa estas lineas, especificandome un poco los tipos de variables y el funcionamiento de ellas:
 
Código: [Seleccionar]
Imag = CType(lector("FOTO"), Byte())
          Me.PictureBox1.Image = Bytes_Imagen(Imag)


Bueno, enerio muchisimas gracias de antemano!!  ::)
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: ravenheart en Junio 04, 2013, 10:21:32 am
Código: [Seleccionar]
Imag = CType(lector("FOTO"), Byte())lector es un DataReader, está convirtiendo el campo FOTO a array de bytes

Código: [Seleccionar]
Me.PictureBox1.Image = Bytes_Imagen(Imag)Convierte el array a una imagen con la función Bytes_Imagen (que no veo definida) y le asigna la imagen resultante a PictureBox1.


Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Prow en Junio 04, 2013, 02:21:47 pm
Puedes reemplazar la función Bytes_Imagen() por el siguiente código:

Código: [Seleccionar]
Dim byteImage() As Byte = CType(reader.Item("binariosImage"), Byte())
Dim msImage As New IO.MemoryStream(byteImage)
pbImage.Image = Image.FromStream(msImage)

Saludos
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: @NetFcruz en Junio 04, 2013, 05:02:29 pm
Código: [Seleccionar]
Imag = CType(lector("FOTO"), Byte())lector es un DataReader, está convirtiendo el campo FOTO a array de bytes

Código: [Seleccionar]
Me.PictureBox1.Image = Bytes_Imagen(Imag)Convierte el array a una imagen con la función Bytes_Imagen (que no veo definida) y le asigna la imagen resultante a PictureBox1.






Listo:
Con respecto a la funcion convertir de imagen a bytes y al consultarla volverla a convertir aqui va.
Código: [Seleccionar]
'Declaras una variable publica arriba o como gustes puede ser privada
Dim Imag As Byte()

 'Parte de las Funciones para convertir un tipo imagen a binario.
    'convertir imagen a binario

    Private Function Imagen_Bytes(ByVal Imagen As Image) As Byte()

        'si hay imagen

        If Not Imagen Is Nothing Then

            'variable de datos binarios en stream(flujo)

            Dim Bin As New MemoryStream

            'convertir a bytes

            Imagen.Save(Bin, Imaging.ImageFormat.Jpeg)

            'retorna binario

            Return Bin.GetBuffer

        Else

            Return Nothing

        End If
    End Function

Y para convertir de binario a imagen pongo el ejemplo, cuando quiero consultarla, de igual creas de tipo Public o Private.

Código: [Seleccionar]
'convertir binario a imagen

    Public Function Bytes_Imagen(ByVal Imagen As Byte()) As Image

        Try

            'si hay imagen

            If Not Imagen Is Nothing Then

                'caturar array con memorystream hacia Bin

                Dim Bin As New MemoryStream(Imagen)

                'con el método FroStream de Image obtenemos imagen

                Dim Resultado As Image = Image.FromStream(Bin)

                'y la retornamos

                Return Resultado

            Else

                Return Nothing

            End If

        Catch ex As Exception

            Return Nothing

        End Try

    End Function


Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Rhema en Junio 04, 2013, 07:51:33 pm
Código: [Seleccionar]
Imag = CType(lector("FOTO"), Byte())lector es un DataReader, está convirtiendo el campo FOTO a array de bytes

Código: [Seleccionar]
Me.PictureBox1.Image = Bytes_Imagen(Imag)Convierte el array a una imagen con la función Bytes_Imagen (que no veo definida) y le asigna la imagen resultante a PictureBox1.







Listo:
Con respecto a la funcion convertir de imagen a bytes y al consultarla volverla a convertir aqui va.
Código: [Seleccionar]
'Declaras una variable publica arriba o como gustes puede ser privada
Dim Imag As Byte()

 'Parte de las Funciones para convertir un tipo imagen a binario.
    'convertir imagen a binario

    Private Function Imagen_Bytes(ByVal Imagen As Image) As Byte()

        'si hay imagen

        If Not Imagen Is Nothing Then

            'variable de datos binarios en stream(flujo)

            Dim Bin As New MemoryStream

            'convertir a bytes

            Imagen.Save(Bin, Imaging.ImageFormat.Jpeg)

            'retorna binario

            Return Bin.GetBuffer

        Else

            Return Nothing

        End If
    End Function

Y para convertir de binario a imagen pongo el ejemplo, cuando quiero consultarla, de igual creas de tipo Public o Private.

Código: [Seleccionar]
'convertir binario a imagen

    Public Function Bytes_Imagen(ByVal Imagen As Byte()) As Image

        Try

            'si hay imagen

            If Not Imagen Is Nothing Then

                'caturar array con memorystream hacia Bin

                Dim Bin As New MemoryStream(Imagen)

                'con el método FroStream de Image obtenemos imagen

                Dim Resultado As Image = Image.FromStream(Bin)

                'y la retornamos

                Return Resultado

            Else

                Return Nothing

            End If

        Catch ex As Exception

            Return Nothing

        End Try

    End Function



Jeje muchas gracias a todos, aqui en la parte de: Bytes_Imagen(Imag).. "Bytes_Imagen" que es?? es una funcion o que debe ir ahi?
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Prow en Junio 04, 2013, 08:03:41 pm
Rhema es una función. Ya te lo explico reavenheart, yo te escribí una alternativa a esa función y Net te puso el contenido de la función.
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: @NetFcruz en Junio 04, 2013, 08:17:05 pm
Es correcto.  8)
Saludos.
Título: Re:Crear Base de Datos que guarde binarios
Publicado por: Rhema en Junio 04, 2013, 10:01:02 pm
Si ya me fije, mil disculpas jeje! y Gracias!!