Almacenar PDF o DOC en MYSQL con VB.NET
Escrito en Enero 6, 2009 por Alex
Cual sería la manera correcta de almacenar archivos como imágenes y documentos para un programador?
Algunas técnicas consisten en guardar solo la ruta o el Path del archivo y depués solo decirle a la aplicación que lo abra, ya que almacenarlo en la base de datos, podría ocasionar que la BD se alente al procesar la información, es decir, afectaría el “performance”.
Pero a veces se necesita seguridad en la aplicación y la mejor opción no siempre es la misma, así que en lo posible, no se deberian de almacenar archivos en una BD a menos que sea necesario.
Aquí pongo el ejemplo de como almacenar un documento, que en este caso sería PDF pero que aplica igual para otro tipo de archivos.
Necesitamos insertar dos botones de comando, un Control OpenFileDialog, y un PDF Browser Control. Este control se agrega desde el menú “Elegir elementos” del cuadro de controles y se llama Adobe PDF Reader y esta en la ficha “Componentes COM”.
Omito la manera de hacer las referencias al conector Mysql y algunos comentarios de explicación porque ya están explicados en anteriores posts.
Imports System.Data Imports MySql.Data.MySqlClient Imports System.IO Public Class Form1 Dim RutaPDF As String #Region "variables y objetos" Dim ConStr As String = "server=localhost;uid=miuser;password=mipass;database=mibase" Dim Sql As String = "Select pdf from archivo where id='1'" Dim Con As New MySqlConnection(ConStr) Dim Comando As New MySqlCommand(Sql, Con) Dim Dr As MySqlDataReader 'variable de datos Dim bDatos() As Byte 'variable de imagen Dim iImagen As File #End Region #Region "Funciones para tratar archivos PDF" 'convertir PDF a Binario Public Function PDF_Bytes(ByVal Path As String) As Byte() Dim sPath As String sPath = Path Dim Ruta As New FileStream(sPath, FileMode.Open, FileAccess.Read) Dim Binario(CInt(Ruta.Length)) As Byte Ruta.Read(Binario, 0, CInt(Ruta.Length)) Ruta.Close() Return Binario End Function 'convertir binario a PDF Private Sub Bytes_PDF(ByVal Bin As Byte()) Dim oFileStream As FileStream Dim pathTemporal As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Dato.pdf" If File.Exists(pathTemporal) Then File.Delete(pathTemporal) oFileStream = New FileStream(pathTemporal, FileMode.CreateNew) oFileStream.Write(Bin, 0, Bin.Length) oFileStream.Close() oFileStream = Nothing AR1.LoadFile(pathTemporal) If File.Exists(pathTemporal) Then File.Delete(pathTemporal) End Sub Public Function UpdateBD(ByVal Sql As String, ByVal Data() As Byte) As String Dim Comando As New MySqlCommand(Sql, Con) Comando.Parameters.AddWithValue("?archivo", Data) Try If Not Con Is Nothing Then Con.Close() Con.Open() Dim res As Integer = Comando.ExecuteNonQuery() Return res.ToString Catch ex As Exception Return ex.Message Finally Con.Close() Comando = Nothing End Try End Function #End Region 'Esto ocurre en la carga del formulario 'y solo se ejecuta cuando ya existe un archivo en la BD Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Si no hay conexión activa se establece conexión con la BD 'siempre capturando errores con try Try If Not Con Is Nothing Then Con.Close() Con.Open() 'Una vez establecida la conexión ejecutamos la Query 'asignando el resultado al objeto MysqlDataReader Dr = Comando.ExecuteReader 'Mientras este leyendo, cada resultado que por la Query ' no es mayor a uno While Dr.Read 'lo guardamos en una variable de tipo array de bytes 'y convertimos en byte el resultado por si tenemos 'activado Option Strict en ON bDatos = CType(Dr("pdf"), Byte()) 'si la consulta no genera datos salimos del Sub If bDatos.Length = 0 Then Exit Sub 'SI HAY DATOS 'al ser datos binarios, los convertimos a PDF 'con una funcion que hicimos llamada bytes_PDF 'asignandolo a la variable de datos Bytes_PDF(bDatos) End While 'en caso de error mostramos el mensaje Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'utilizamos el OPenFileDialog para seleccionar PDFs 'Establecemos titulo a mostrar Me.OpenFileDialog1.Title = "Seleccionar Documento" 'aquí por ser PDF les recomiendo abrir por default la carpeta 'Mis Documentos y utilizamos una variable de entorno de windows 'Enviroment.SpecialFolder.MyDocuments apunta a Mis Documentos Me.OpenFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 'filtramos solo Archivos PDF 'siempre es recomendable filtrar para evitar errores al seleccionar archivos Me.OpenFileDialog1.Filter = "Archivos de imágen(*.pdf)|*.pdf" ' abrir el diálogo Me.OpenFileDialog1.ShowDialog() End Sub 'AQUI UTILIZAMOS EL EVENTO FILE_OK 'PARA SABER EN QUE MOMENTO YA SE SELECCIONO UNA IMAGEN Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk 'Asignar ruta y mostrar Documento RutaPDF = OpenFileDialog1.FileName AR1.LoadFile(RutaPDF) End Sub 'Y EN ESTE EVENTO DEL BOTON GUARDAMOS LA IMAGEN EN LA BD Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Try 'si se seleccionó archivo If OpenFileDialog1.FileName <> "" Then 'variable para datos Dim PDF() As Byte 'convertir PDF a binario 'y guardar en variable PDF = PDF_Bytes(RutaPDF) 'guardar la imagen en BD con parametros utilizando una funcion para guardar 'llamada UpdateBD Dim res As String = UpdateBD("UPDATE archivo SET pdf=?archivo WHERE id='1'", PDF) 'aqui comprobamos si se modifico algun campo If res = "1" Then MsgBox("Archivo guardado") Else MsgBox("Archivo no se guardó") End If End If Catch ex As Exception End Try End Sub End Class
Un archivo muy grande superaría la capacidad del campo de Mysql y no se guardaría el archivo.
Nota: El campo LongBlob de Mysql debe existir con un dato aunque sea null ya que la sentencia usada no es INSERT sino UPDATE.
Si te gusto este artículo Suscribete a nuestro feed






Como cargar pdf ya guardado
Porfavor alguien que me ayude, al guardar el pdf a la base de datos Mysql todo perfecto, lo que necesito es que pueda traer el pdf ya guardado para mostrarlo en el “AxAcroPDF1″, he probado con varias opciones pero aun no he podido, supongo que se realiza la senencia sql con algun proceso para convetir de byt a pdf y luego cargarlo pero no puedo que alguien me ayude porfavor
Este código les sirve para leer el documento PDF que ya esta almacenado en la base de datos.
La parte que hace esto es la funcion Bytes_PDF.
Cualquier duda comentar.
Muchas gracias por publicar este codigo, me ha sido de gran ayuda.
Quiero guardar un archivo de imagen en la base de datos … que parte tendria q modificar? gracias de antemano soy nuevo en esto
Jorge:
El siguiente post tiene la respuesta:
http://www.mejoralex.com/guardar-imagen-en-mysql-con-net
Siguiente linea AR1.LoadFile(RutaPDF)
ese AR1 es una variable o un control? donde lo declaran?
AR1 EN ESTE CASO PERTENECE AL CONTROL Adobe PDF Reader, TIENES QUE PONERLO EN EL FORMULARIO, PARA QUE PUEDAS VERLO
EL NOMBRE QUE LE DA LA PROPIEDAD NAME ES AxACROPDF1