Android Question [SOLVED] Uploading Photos from Database Records to Server

jroriz

Active Member
Licensed User
Longtime User
I have a database that stores the location of the photo in the record, in the "foto" field.
Now I need to upload this to my server.

In GravarRegistros, using DBUtils.ExecuteJSON, I create the json that I want to upload to the server.

GravarRegistros:
Sub GravarRegistros

    Dim registros As JSONGenerator
   
    Dim strsql As String = $"Select id, usuario, data, foto
            FROM inspecao
            order by id"$
   
    registros.Initialize(DBUtils.ExecuteJSON(Main.SQL1, strsql, Null, 2, _
                Array As String(DBUtils.DB_INTEGER, DBUtils.DB_INTEGER, DBUtils.DB_TEXT, DBUtils.DB_TEXT)))
   
...
    jg.PostString(Main.URLServidor & "/app/receberjson.php?fotos", registros.ToString)
...

End Sub

Registros results in:
JSON:
{root=[

{id=1, usuario=33, data=2024-03-17, foto=pictures/1710690749110.jpg},

{id=2, usuario=33, data=2024-03-17, foto=pictures/1710690747581.jpg}

]}

I need Registros to result in:

JSON:
{root=[

{id=1, usuario=33, data=2024-03-17, foto=***PHOTO CONTENT***},

{id=2, usuario=33, data=2024-03-17, foto=***PHOTO CONTENT***}

]}

Thank you in advance!
 

jroriz

Active Member
Licensed User
Longtime User
I figured it out myself.

B4X:
Sub GravarRegistros(usuario As Int)

    Dim enviados As String = "<> 'enviado'"   
    
    If txtPeca.Text <> "" Then
        ' filtra somente a peça, independente do status
        enviados = $" <> '*' and peca = '${txtPeca.Text}'"$
    End If
    
    #if DEBUG
'        enviados = "<> 'enviado'"
    #End If
    
    Dim Cursor As Cursor
    Cursor = Main.SQL1.ExecQuery($"Select id, usuario, data, Cliente,
            Unidade, ciclo, area, subarea, formulario, peca, grupo, pergunta, resposta, foto
            FROM inspecao
            where coalesce(status, '') ${enviados} order by id"$)
    
    Dim m As Map, registros As List
    
    registros.Initialize
    
    For i = 0 To Cursor.RowCount - 1
        Cursor.Position = i

        progresso.Value = i * 100 / Cursor.RowCount

'        Dim id As Int = Cursor.Getint("id")
'        Dim usuario As Int = Cursor.Getint("usuario")
'       
'        images.Initialize
        
        m.Initialize

        For y = 0 To Cursor.ColumnCount -1

            Dim coluna As String = Cursor.GetColumnName(y)
            
'            m.put("usuario", usuario)
            
            If coluna = "foto" Then
                
                If Cursor.GetString(coluna) <> Null Then

                    Dim base64con As Base64Convert
                    base64con.Initialize
                    m.Put(coluna, base64con.EncodeFromImage(File.DirRootExternal, Cursor.GetString(coluna)))

                End If
                
            Else
                m.Put(coluna, Cursor.GetString(coluna))
            End If

        Next
        
        registros.Add(m)

    Next
    
    Dim json As JSONGenerator
    
    json.Initialize2(registros)
    Dim jg As HttpJob
    jg.Initialize("", Me)


    jg.PostString(Main.URLServidor & "/app/receberjson.php", json.ToString)

    Wait For (jg) JobDone (jg As HttpJob)
    
    If jg.Success Then
        
        func.msg(jg.GetString)
'        Main.SQL1.ExecNonQuery("UPDATE inspecao set STATUS = 'enviado' where id = " & id)

    Else
        func.msg("erro 132 " & jg.ErrorMessage)
    End If

    jg.Release

    Dim numeracao As String = Main.SQL1.ExecQuerySingleResult($"select valor from opcoes where opcao = 'numeracao'"$)
    
    Dim jg As HttpJob
    jg.Initialize("", Me)

    jg.PostString(Main.URLServidor & "/app/receber.php", $"numeracao=${numeracao}&usuario=${usuario}"$)

    Wait For (jg) JobDone (jg As HttpJob)
    
    If jg.Success Then
        
        Log("enviado " & i)
        
    Else
        func.msg("erro 183 " & jg.ErrorMessage)
    End If

    jg.Release

'    ProgressDialogHide
    CarregarLayout
    Return

End Sub

Any comment to improve the code/performance is welcome.
 
Upvote 0
Top