¿Cómo puedo insertar y extraer una imagen de un campo BYTEA de PostgreSQL desde Access?

Disculpen porque hago 2 preguntas en una, pero es que están totalmente relacionadas.

Necesito desde un formulario insertar un registro en donde uno de los campos es una imagen en formato JPG en una base de datos que tengo alojada en la nube, utilizo el servicio de Cloud Cluster . Y mediante otro formulario requiero mostrar la imagen alojada en el servidor.

He estado consultando en la web, mediante Google y videos en YouTube y no ha sido posible encontrar lo que necesito.

1 Respuesta

Respuesta
1

Martha se puede hacer volcando a disco la imagen del campo BYTEA tratándolo como tipo binario.

Estructura de la tabla para el ejemplo

Private Sub btnInsertar_Click()
 If IsNull(Me.txtDescripcion) Then
   MsgBox "Se requiere una descripción", vbInformation, "Cuidado"
   Me.txtDescripcion.SetFocus
   Exit Sub
 End If
    Call DiscoAOle
End Sub

Observe que el campo fingerprintimg es de tipo bytea.

INSERTAR LA IMAGEN

Anoto en el campo "Descripción" la información sobre el contenido de la imagen, en el campo "Archivo" hago clic sobre el botón de la carpeta y selecciono una imagen, esta aparece como muestra la imagen. Para seleccionar la imagen utlizo msoFileDialogFilePicker, no lo explico porque asumo que ya sabe cómo se utiliza.

CÓDIGO DEL BOTON INSERTAR

Private Sub btnInsertar_Click()
 If IsNull(Me.txtDescripcion) Then
   MsgBox "Se requiere una descripción", vbInformation, "Cuidado"
   Me.txtDescripcion.SetFocus
   Exit Sub
 End If
    Call DiscoAOle
End Sub

Observe que llamo la función para manipular el campo OLE.

Public Function DiscoAOle()
    Dim rst As DAO.Recordset, sql, Ruta  As String, NumArchivo As Byte, Aux As Boolean
    Dim Matrix() As Byte
     On Error GoTo ManipularError
    sql = "SELECT * FROM FingerprintDB"
    Set rst = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
    NumArchivo = FreeFile
    Ruta = Me.txtArchivo
    Aux = True: Open Ruta For Binary Access Read As #NumArchivo
    ReDim Matrix(LOF(NumArchivo) - 1)
    Get #NumArchivo, , Matrix
    Close #NumArchivo: Aux = False
    With rst
        .AddNew
            ![first_name] = Me.txtDescripcion
            !nombre = Dir(Ruta)
            !fingerprintimg = Matrix
        .Update
    End With
     rst.Close: Set rst = Nothing
     MsgBox "Registro agregado correctamente", vbInformation, "Aviso"
     Me.txtDescripcion = Null: Me.txtArchivo = Null
Salir:
    Exit Function
ManipularError:
    If Aux Then: Close #NumArchivo
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgBox Err.Description, vbCritical, "Atención"
    Resume Salir
End Function

Lo anterior adiciona el registro en la tabla de PostgreSQL.

EXTRAER CONTENIDO CAMPO BYTEA DE POSTGRESQL

CÓDIGO DEL BOTÓN EXTRAER

Private Sub btnExtraer_Click()
    If Not IsNull(Me.Lista) Then
        Call OleADisco1
    Else
        MsgBox "SELECCIONE UN ARCHIVO", vbInformation, "AVISO"
    End If
End Sub
Public Sub OleADisco1()
    Dim rst As DAO.Recordset, sql, Ruta As String, Aux As Boolean
    Dim Matrix() As Byte
    Dim NumArchivo As Byte
    'NOTA EPF:
    '          Tambien se puede extraer con
    '          call DescargarArchivo("https://i.postimg.cc/Cx7C5r1n/form-maestra.jpg",currentproject.Path & "\maestra.jpg")
    ' Si es de una ubicación, siempre y cuando el final sea el nombre del archivo con la extensión
    On Error GoTo ManipularError
    sql = "SELECT * FROM FingerprintDB WHERE Id = " & Me.Lista & " "
    Set rst = CurrentDb.OpenRecordset(sql, dbOpenForwardOnly)
    With rst
        NumArchivo = FreeFile
        Ruta = CurrentProject.Path & "\" & !nombre & ""
        Matrix = !fingerprintimg
    End With
    rst.Close: Set rst = Nothing
    Aux = True: Open Ruta For Binary Access Write As #NumArchivo
    Put #NumArchivo, 1, Matrix
    Close #NumArchivo: Aux = False
    MsgBox "Archivo extraido correctamente", vbInformation, "AVISO"
Salir:
    Exit Sub
ManipularError:
    If Aux Then: Close #NumArchivo
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgBox "Error al descargar la imagen" & vbCrLf & vbCrLf & Err.Description, vbCritical, "Atención"
    Resume Salir
End Sub
Private Sub Form_Open(Cancel As Integer)
 ' Me.Caption = "ENTIDAD EN USO : " & strEntidad
End Sub

NOTA: El ejemplo lo elaboré con una tabla vinculada a PostgreSQL con base en el DSN.

Por simplicidad el archivo lo descargo en la carpeta de la aplicación, pero la idea es que se pueda seleccionar el destino. Martha, como tengo su correo le estoy enviando el ejemplo, debe cambiar los nombres de la tabla y campos de acuerdo con sus necesidades.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas