Italian Download e salvataggio immagini in locale

AlpVir

Well-Known Member
Licensed User
Longtime User
Non riesco a creare una semplice app che scarichi dal web una serie di immagini jpg, una dopo l'altra, e le salvi sullo smartphone.
Ovviamente conosco l'URL esatta di queste immagini che nell'esempio qui sotto ha la sintassi
img1.jpg, img2.jpg, ecc.
Ho provato con HttpUtil2 ma ... niente.
Ho anche esaminato l'esempio FlicrViewer ma non sono riuscito ad applicare correttamente la procedura di salvataggio

B4X:
'Dim Nom As String
'Dim out As OutputStream
'Nom= "img" & CStr(IDEff) & ".jpg"        ' IDEff è una variabile globale
'out = File.OpenOutput(File.DirRootExternal & "/Immagini",Nom,False )
'File.Copy2(Job.GetInputStream, out)      '    job o imagejob ?
'out.Close

Qualcosa del genere

B4X:
for i=1 to 100
  NomeFile="http://www.nomesito.it/Immagini/img"  & cstr(i) & ".jpg"
  '  effettuo il download (questo sono riuscito a farlo)
' . . . . . .
'    salvo in File.DirRootExternal & "/Immagini" ( e questo no)
' . . . . .
next

Grazie per l'attenzione.
 

KPmaster

Member
Licensed User
Longtime User
Ciao, prova a prendere spunto da questo codice che ho scritto, modificandolo per le tue esigenze.

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim job1 As HttpJob
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    job1.Initialize("job1", Me)
    job1.Download("http://www.iotuosito.it/immagine1.jpg")
End Sub

Sub JobDone(Job As HttpJob)
    If Job.Success = True Then
        Dim Out As OutputStream
        Out = File.OpenOutput(File.DirDefaultExternal, "immagine1.jpg", False)
        Job.GetBitmap.WriteToStream(Out, 100, "JPEG")
    End If
End Sub
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Grazie !
E' proprio quello che ho fatto io; ho modificato un codice del tutto simile e sono riuscito a salvare UNA sola immagine. Se inserisco il codice all'interno di un ciclo in cui cambia via via l'URL (e ovviamente il nome dell'immagine salvata che può anche essere identico), viene salvata solo l'ULTIMA immagine.
Ecco la modifica che ho fatto al tuo codice.
B4X:
    Dim i As Int
    job1.Initialize("job1", Me)
    For i=1 To 2
        If i=1 Then NomeFile="1305Pers.jpg"
        If i=2 Then NomeFile="3502Pers.jpg"
        job1.Download("http://www.xxxx/Immagini/" & NomeFile)
    Next
Il problema è (probabilmente) che il job è unico; bisognerebbe creare un diverso JobDone per ogni download e salvataggio. Io qui ragiono alla vecchia maniera, istruzione dopo istruzione mentre "lui" ragiona in modo più complesso e fa diverse cose insieme.
 

KPmaster

Member
Licensed User
Longtime User
Ciao,
credo che tu debba eseguire il successivo download dopo ogni JobDone. Prova qualcosa di simile, non l'ho testato ma logicamente potrebbe funzionare:

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim job1 As HttpJob
    Dim i As Int
    Dim nomefile As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
   
    i = 1
    nomefile = "immagine1.jpg"
    job1.Initialize("job1", Me)
    job1.Download("http://www.iltuosito.it/"&nomefile)
End Sub

Sub JobDone(Job As HttpJob)
    If Job.Success = True Then
        Dim Out As OutputStream
       
        Out = File.OpenOutput(File.DirDefaultExternal, nomefile, False)
        Job.GetBitmap.WriteToStream(Out, 100, "JPEG")
        i = i + 1
        Select i
            Case 2
                nomefile = "immagine2.jpg"
            Case 3
                nomefile = "immagine3.jpg"
            Case 4
                nomefile = "immagine4.jpg"
        End Select
        ' in questo modo dopo le 4 immagini non faccio più nulla
        If i < 5 Then
            job1.Download("http://www.iltuosito.it/"&nomefile)
        End If
    End If
End Sub
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Perfetto ! Funziona ! Ho aggiunto qualcosettina solo per renderlo un progettino completo, utile a qualcun'altro. Ovviamente bisogna fare riferimento alla libreria HttpUtils2.
Molte grazie !
B4X:
Sub Process_Globals
End Sub

Sub Globals
    Dim job1 As HttpJob
    Dim i As Int
    Dim NomeFile As String
End Sub
Sub Activity_Create(FirstTime As Boolean)
    i = 1
    NomeFile = CStr(i) & ".jpg"
    job1.Initialize("job1", Me)
    job1.Download("http://nomesito/"&NomeFile)
End Sub
Sub JobDone(Job As HttpJob)
    If Job.Success = True Then
        Dim Out As OutputStream
        Out = File.OpenOutput(File.DirRootExternal , NomeFile, False)
        Job.GetBitmap.WriteToStream(Out, 100, "JPEG")
        i = i + 1
        NomeFile = CStr(i) & ".jpg"
        Log(NomeFile)
        ' in questo modo dopo le 4 immagini non faccio più nulla
        If i < 5 Then
            job1.Download("http://nomesito/" & NomeFile)
        Else
            Msgbox ("Fine","")
            Activity.Finish
        End If
    End If
End Sub
Sub CStr(o As Object) As String
Return "" & o
End Sub
 

KPmaster

Member
Licensed User
Longtime User
Ottimo. Il mio codice d'esempio voleva infatti servirti da spunto per implementarlo secondo le tue esigenze.
Mi fa piacere vada bene.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Veramente il codice è di KPmaster, non mio. Io mi sono limitato a qualche ritocco funzional/estetico.
 
Top