Italian Problema con download file

toro1950

Active Member
Licensed User
La mia App utilizza due database, devo trasferirli su una cartella del mio sito per poterli riprendere in seguito, con un altro cellulare o con lo stesso,
Per trasferili nessun problema, utilizzo un collagamento ftp, per riprenderli ho un problema su uno dei due database, questo su Androide mentre con B4i su iphone
nessun problema, chiaramente utilizzo lo stesso codice per ambedue i sistemi.
B4X:
Private Sub importa
    fl = txtcognome.Text.Trim & txtnome.Text.Trim
    testo= "nomedb" & ".xls"
    testo1= fl & testo
  
    Dim j As HttpJob
    j.Initialize("", Me)
    j.Download("https://www.miosito.it/public/myfolder/" & testo1)
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        ' cancello il file esistente
        If File.Exists(xui.DefaultFolder, "nomedb.xls") Then
         File.Delete(xui.DefaultFolder, "nomedb.xls")
        End If
               
        Dim out As OutputStream
        out = File.OpenOutput(xui.DefaultFolder,testo, False)
        
        File.Copy2(J.GetInputStream,out)
        out.close
          ToastMessageShow ("File scaricato",False)
        j.Release
        fl=fl & testo
    rimuovi ' rimuove il file dal sito
          End If
    
End Sub
Questo file viene sempre scaricato e utilizzato dall'app, mentre il prossimo non viene visto correttamente dall'app , al primo utilizzo l'app esce, riavvio l'app
non esce più ma non vede il database e mi permette anche di aggiungere record
B4X:
Sub Button5_Click
    Private currentyear As Int = DateTime.GetYear(currentticks)
    fl = txtcognome.Text.Trim & txtnome.Text.Trim
    testo = "nomedb" & currentyear & ".xls"
    testo1= fl & testo
    Dim j As HttpJob
    j.Initialize("", Me)
    j.Download("https://www.miosito.it/public/Myfolder/" & testo1)
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
   'cancello il file esistente
        If File.Exists(xui.DefaultFolder, "nomedb" & currentyear &".xls") Then
            File.Delete(xui.DefaultFolder, "nomedb" & currentyear &".xls")
        End If
        Dim out As OutputStream
        
        out = File.OpenOutput(xui.DefaultFolder,testo, False)
        Msgbox (J.GetInputStream,"")
        File.Copy2(J.GetInputStream,out)
        out.close
        ToastMessageShow ("File scaricato",False)
                
        j.Release
        fl=fl & testo
      rimuovi  ' rimuove il file dal sisto 
        Sleep(1000)
        importa
        
    End If

End Sub
ho effettuato alcune prove senza successo,
1) ho dato un estensione diversa ai due database. (non ho utilizzato .db perche il file viene bloccato da windows) viene sempre scaricato correttamente il primo
2) ho provato a togliere la data al file, anche se essenziale ma non risolve il problema
3) ho invertito l'ordine del download dei due file ma viene sempre scaricato corettamente il primo (quello su importa che non ha la data sul nome del db)
Come dicevo all'inizio con b4i i due datbase vengono caricatti correttamente, se li traferisco con Androide l'iphone li riprende correttamente, lo scopo di tutto ciò
è dovuto a quesata esigenza, cambiando cellulare si possono salvare e riprendere i due file. Ho aperto i due file sul sito e contengon ambedue i dati corretti
quindi l'upload ftp funziona correttamente. Cosa mi consgliate?
sospetto questo---> xui.DefaultFolder ????
 

LucaMs

Expert
Licensed User
Longtime User
Poi leggerò tutto con più calma (+tempo e +salute) ma "mi blocco" subito su questa tua frase:
al primo utilizzo l'app esce
Per scovare un bug, DEVI:
1 - eseguirla in debug, non compilarla in release
2 - se smartphone e PC sono connessi tramite Bridge (e non cavo usb), nel Main aggiungi:
B4X:
#BridgeLogger: True
affinché il messaggio d'errore si veda nel tab Log dell'IDE.
Messaggio d'errore che è fondamentale, per farti capire il motivo per cui "l'app esce" ed anche per farti aiutare da noi (lo pubblicheresti, pubblicate sempre il messaggio d'errore).
 

LucaMs

Expert
Licensed User
Longtime User
(Premesso che è importante fare ciò che ho scritto nel post precedente: senza messaggio d'errore, si va per tentativi a caso e ci si perde nel codice, si sprecano tempo e neuroni 😁)

al primo utilizzo l'app esce, riavvio l'app
non esce più ma non vede il database e mi permette anche di aggiungere record
Suppongo che "esca" quanto premi il tasto (Button5 - non lascio mai i nomi di default), non all'avvio dell'app, giusto?
e che ci sia un errore di digitazione, ovvero "non vede il database e NON mi permette di aggiungere record".

Intanto cambierei qualcosina nella routine (Sub Button5_Click) "per i miei gusti", leggerla meglio (non correggo, eh, a meno che non veda l'errore, cosa che per ora non...)
B4X:
Sub Button5_Click
    Private currentyear As Int = DateTime.GetYear(currentticks)
    fl = txtcognome.Text.Trim & txtnome.Text.Trim
    NomeFile = "nomedb" & currentyear & ".xls" ' ex variabile testo
    NomeFileConCognome = fl & NomeFile
    Dim j As HttpJob
    j.Initialize("", Me)
    j.Download("https://www.miosito.it/public/Myfolder/" & NomeFileConCognome)
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
   'cancello il file esistente
        If File.Exists(xui.DefaultFolder, NomeFile) Then
            File.Delete(xui.DefaultFolder, NomeFile)
        End If
        Dim out As OutputStream
    
        out = File.OpenOutput(xui.DefaultFolder, NomeFile, False)
'        Msgbox (J.GetInputStream,"")  ' Non vorrei che il get svuotasse lo stream, dovrei verificare.
        File.Copy2(J.GetInputStream,out)
        out.close
        ToastMessageShow ("File scaricato",False)
            
        j.Release
        fl=fl & testo ' hai già NomeFileConCognome (ex testo1)
      rimuovi  ' rimuove il file dal sisto
        Sleep(1000)
        importa
    
    End If

End Sub
B4X:
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
' Msgbox (J.GetInputStream,"") ' Non vorrei che il get svuotasse lo stream, dovrei verificare.
ChatGPT:

1725692121367.png
 

udg

Expert
Licensed User
Longtime User
Un primo necessario accorgimento sarebbe portare j.release fuori da end-if.
Altrimenti rilasci solo in caso di successo.
Per facilità di lettura potresti utilizzare le smart string invece di concatenate elementi.
Scusa la risposta concisa e senza esempi o riferimenti ma scrivo da cellulare.
 

toro1950

Active Member
Licensed User
Buongiorno, il messaggio Msgbox (J.GetInputStream,"") è rimasto li nell'ultima prova che ho fatto per cercare di capire,
e ho dimenticato di toglierlo. il codice del b4a inizialmente era appena diverso, dichiaravo la varibile SQLDataBasePath = xui.DefaultFolder
ed utilizzavo questa, trovando l'errore ho fatto un copia ed incolla del codice dal B4i, quindi praticamente è lo stesso. Ho provato con compila
ed esegui come mi hai consigliato; nel log escono diversi avvertimenti, tipo msgbox è deprecato usa medoti asincroni, varibile non utilizzata, o non
ho assegnato nessun valore, un libreria non utilizzata ed ultima voce che il targetSdkvalore è 34 o superiore, significa che devo aggiornarlo?.
Solo questo esce e nient'altro, nessun errore, però ho notato che nel menu dell'ide il debug non è attivato. Spiego meglio quando esce: dopo che ho ripristinato
i file con button5, chiudo l'app e la riavvio, uso il pulsante per visualizzare i record del primo database, questi vengono visualizzati correttamente, se uso il pulsante per visualizzare il secondo esce, (il pulsante è uno di AS_DataPicker) al riavvio non esce più, il database non esite più, però mi lascia aggiungere record senza nessun problema
Ho pensato di utilizzare anche io ftp per il download ma non so come fare. Più tardi provo con .dbb, ma ho già provato con .txt, con .rtf
 

LucaMs

Expert
Licensed User
Longtime User
targetSdkvalore è 34 o superiore, significa che devo aggiornarlo?
Puoi copiare il testo del messaggio che trovi nel Tab Logs, premendo il tasto destro del mouse.
Per Google Play Store, il target deve essere almeno 33.

però ho notato che nel menu dell'ide il debug non è attivato
Devi scegliere tu da quella combobox!
1725696610475.png


chiudo l'app e la riavvio
Se tutto è ok, non dovrebbe essere necessario.

il database non esite più, però mi lascia aggiungere record senza nessun problema
Questo è ovviamente impossibile; se il DB non esistesse, come potrebbe consentirti di aggiungere record?

Imposta ed esegui in modalità Debug, poi pubblica il messaggio d'errore (copiandolo come detto sopra).
Controlla bene i nomi dei file ed i percorsi.

FTP: ti basta cercare sul sito (questo, ovviamente) o addirittura chiedere a ChatGPT, come eseguire un download.



[P.S. Usa sempre nomi di variabili e di view "decenti", non lasciare Button5, non chiamare una variabile che conterrà il nome di un file "testo"]
 

Sagenut

Expert
Licensed User
Longtime User
Prova ad aggiungere
B4X:
j.GetRequest.SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36")
subito dopo il comando j.Download
Quella stringa fà credere al sito che il download sia stato richiesto da un desktop.
A volte non apprezzano le chiamate da mobili.
E di solito non noti nessun errore ma semplicemente non viene scaricato il file.
 

toro1950

Active Member
Licensed User
Sagenut Grazieeeeeeeeeeeeeeeeeeeeeee! sei un grande, con l'aggiunta del tuo codice funziona. La cosa è un pò strana; mi chiedo come mai con l'altro database
non c'erano problemi, forse per il contenuto. Ora provo anche con ftp per imparare un pò di più. Questo era l'ultimo step per finire le app a parte qualche ritocco grafico
e aggiornare SDK. Ringrazio a tutti voi, sprattutto a te e Lucas, per l'aiuto e la pazienza che avete avuto, Ringrazio anche udg per la dritta che mi ha dato
Questo è ovviamente impossibile; se il DB non esistesse, come potrebbe consentirti di aggiungere record?
la soluzione di Sagenut spiega tutto, il database veniva cancellato ma non sostituito, il software non
trovandolo lo creava ed inizializzava com fà al primo avvio
 

Sagenut

Expert
Licensed User
Longtime User
Quella stringa fà credere al sito che il download sia stato richiesto da un desktop.
Questa forse è una descrizione impropria.
Quella più corretta probabilmente è che imposta lo User Agent per far risultare la richiesta come proveniente da un browser.
 
Top