Hack x Crack - Comunidad de Seguridad informática
Programación => Visual Basic => Mensaje iniciado 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!
-
Para guardar binarios en BD tienes el tipo BLOB normalmente.
-
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
-
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.
-
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
-
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.
cmd.Parameters.Add("@mp3", SqlDbType.VarBinary).Value = varMemoryStream.GetBuffer()
-
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.
cmd.Parameters.Add("@mp3", SqlDbType.VarBinary).Value = varMemoryStream.GetBuffer()
Muchas gracias, crees que con eso(IO.MemoryStream) baste para guardarlo y cargarlo?
-
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.
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..
-
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.
-
[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!
-
[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:
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
-
¿Y cómo lo abres después?
-
Bien pongo una subrutina para busqueda de foto y abrirlo y la adaptas.
'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.
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
-
Muy bien @NetFcruz
Sólo una cosa. La siguiente consulta es vulnerable a SQLi
"SELECT * FROM tb_transporte WHERE IDUNIDAD=" & Me.txtUnidad.Text & ""
Saludos!
@NetFcruz DICE:
Si es verdad porque puede filtrar mucho, no es una consulta segura, poden hacerlo con el stored es mas seguro. Ademas del *.
-
Una duda, me podrian explicar un poco mas precisa estas lineas, especificandome un poco los tipos de variables y el funcionamiento de ellas:
Imag = CType(lector("FOTO"), Byte())
Me.PictureBox1.Image = Bytes_Imagen(Imag)
Bueno, enerio muchisimas gracias de antemano!! ::)
-
Imag = CType(lector("FOTO"), Byte())
lector es un DataReader, está convirtiendo el campo FOTO a array de bytes
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.
-
Puedes reemplazar la función Bytes_Imagen() por el siguiente código:
Dim byteImage() As Byte = CType(reader.Item("binariosImage"), Byte())
Dim msImage As New IO.MemoryStream(byteImage)
pbImage.Image = Image.FromStream(msImage)
Saludos
-
Imag = CType(lector("FOTO"), Byte())
lector es un DataReader, está convirtiendo el campo FOTO a array de bytes
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.
'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.
'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
-
Imag = CType(lector("FOTO"), Byte())
lector es un DataReader, está convirtiendo el campo FOTO a array de bytes
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.
'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.
'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?
-
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.
-
Es correcto. 8)
Saludos.
-
Si ya me fije, mil disculpas jeje! y Gracias!!