Italian Scaricare un file senza OkHttpUtils e senza mostrare l'url

Elric

Well-Known Member
Licensed User
Ciao,

c'è un modo?

Ho provato con una webview e un tag <a> ma cliccando sul link non scarica.

L'unica alternativa sembra essere aprire l'url nel browser ma in questo modo è evidente il link e sia per questioni di eleganza che di sicurezza preferirei non si vedesse.

Qualche idea/suggerimento?

Grazie!
 

drgottjr

Expert
Licensed User
Longtime User
il tag <a> non vuol dire scaricare nel senso di scaricare per guardare. il browser (o webview)
scarica la pagina indicata dal tag per mostrarla nel schermo e guarda il contenuto temporaneamente
nella sua cache. se vuoi scaricare (per guardare) l'obbvietivo del tag, devi sapere l'url e poi
utilizzare okhttp. accedere a la cache e difficilissimo se no impossibile, visto che il browser non
guarda l'url e il suo contenuto; crea un file e assegna un nome che soltanto ha significato per il browser.
inoltre, prepara il contenuto per accesso piu tardi se bisogno a.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
scusa la domanda, ma perchè non vuoi usare OkHttpUtils ??
 

Elric

Well-Known Member
Licensed User
scusa la domanda, ma perchè non vuoi usare OkHttpUtils ??
Se non ho capito male, da dicembre 2021 è necessario che il dispositivo Android abbia almeno Android 5+

Sto lavorando ad un workaround per utilizzare l'app anche per versioni "vecchie" di Android per scaricare un file senza utilizzare OkHttpUtils.

il tag <a> non vuol dire scaricare nel senso di scaricare per guardare. il browser (o webview)
scarica la pagina indicata dal tag per mostrarla nel schermo e guarda il contenuto temporaneamente
nella sua cache. se vuoi scaricare (per guardare) l'obbvietivo del tag, devi sapere l'url e poi
utilizzare okhttp. accedere a la cache e difficilissimo se no impossibile, visto che il browser non
guarda l'url e il suo contenuto; crea un file e assegna un nome che soltanto ha significato per il browser.
inoltre, prepara il contenuto per accesso piu tardi se bisogno a.

Dunque, se io creo una webview e imposto il contenuto come segue:
B4X:
WebView1.LoadHtml($"<html><body><center><a href="https://www.b4x.com/android/forum/attachments/b4xpagealtvsdb-zip.121991" download>DOWNLOAD THE FILE</a></center></body></html>"$)

Mi ritrovo la webview dentro cui appare
DOWNLOAD THE FILE
e cliccandoci sopra dovrebbe scaricare il file ma non lo fa.

Vorrei lo facesse o che ci fosse una soluzione simile ma al momento, io, ho trovato solo questa
B4X:
Dim p As PhoneIntents
    StartActivity(p.OpenBrowser("https://www.b4x.com/android/forum/attachments/b4xpagealtvsdb-zip.121991"))
ma diventa tutto più macchinoso.
 

drgottjr

Expert
Licensed User
Longtime User
prima, mi scusa. cuando ho detto "guardare" prima, volia dire "salvare".

ci sono http e okhttp. http funziona ancora sulli dispositivi vecchi. cercalo. cualquno ha domandato la stessa cosa poco tempo fa... non l'ho piu...

il tag <a> con file di tipo .zip non funziona della stessa maniera come con un file di tipo .jpg o .html. il browser "sa" cosa fare con .html o .jpg. ma no lo sa con .zip. quindi offre un tale file per scaricamento. le regole sono distinte.

in un browser "vero" come chrome desktop, l'url tuo:
WebView1.LoadHtml($"<html><body><center><a href="https://www.b4x.com/android/forum/attachments/b4xpagealtvsdb-zip.121991" download>DOWNLOAD THE FILE</a></center></body></html>"$)
funziona come vuoi (guarda l'immagine allegata). cuando faccio click, mi invita a scaricare e salvare l'archivio .zip. ma non funziona cosi nel webview ( webview non e un browser). le regole ...

se cambio l'url, ad ess.:
WebView1.LoadHtml($"<html><body><center><a href="https://www.b4x.com/" download>DOWNLOAD THE FILE</a></center></body></html>"$)
la pagina funziona come ho detto prima: la pagina si vede nel schermo, ma non si puo salvare.

d'altra parte, con httputils (se lo trovai) puoi scaricare (e salvare) tutto genere di file.
 

Attachments

  • scaricare.png
    scaricare.png
    83.3 KB · Views: 124
  • cap1.png
    cap1.png
    5 KB · Views: 121
  • cap2.png
    cap2.png
    32.7 KB · Views: 125

drgottjr

Expert
Licensed User
Longtime User
possibilemente e questo..
 

Attachments

  • oldhttputils.zip
    17.6 KB · Views: 156

Sagenut

Expert
Licensed User
Longtime User
Encomiabile il fatto di voler supportare ancora tutti............. ma la tecnologia và avanti e ormai gli Android 4.4 penso siano quasi estinti.
E i 5.0 seguiranno a breve.
Mi chiedo quindi quanto valga la pena di arrovellarsi per cercare workaround per una frazione di utenti davvero minuscola, dalle statistiche della distribuzione delle varie versioni di Android.
Workaround che potrebbero anche generare problemi alla app, di sicurezza o altro.
E' un pò come se oggi i vari software desktop venissero ancora studiati anche per Windows 95, mentre è già stato abbandonato Windows 7.
Così............. solo un pensiero. :) :)
 

udg

Expert
Licensed User
Longtime User
ormai gli Android 4.4 penso siano quasi estinti
Ti sei salvato con quel quasi..
Il cellulare che utilizzo quotidianamente mentre sono in Italia è proprio un 4.4 (ed anche il tablet non è più recente..4.2) :)
Tempo di aggiornarsi? Sicuro. aspetto che mio figlio si decida ad acquistare per sé un nuovo cellulare super-mega-iper (lo pago io..) ed io prendo il suo :)
In fondo, fino ad un paio d'anni fa utilizzavo uno splendido Alcatel Onetouch 308 pagato 19 euro!

E, tanto per dirla tutta, il "modello di punta" di cui dispongo è un Android 7(pagato sempre intorno ai cento euro, perchè di più questi pezzi di plastica non valgono, per quanto mi riguarda)
 

drgottjr

Expert
Licensed User
Longtime User
Grazie.

Ma nella stessa app posso far convivere le due librerie?
due donne alla volta o due librerie - pericolose.
ma non sono qui per giudicare. ti costara poco provare, no? potrebbe funzionare.

prima, se no mi sbaglio, http funziona ancora. no l'ho provato (e non mi interessa). okhttp
e una altra implementazione per communicarsi con un server http(s). piu robusto, diciamo.
facilita la cosa.

per cuanto riguarda 2 librerie facendo la stessa cosa nella stessa app, posso immaginare
almeno 4 metodi (senza aver provato nessuno). supponiamo che si tratta di 2 dispositivi
- uno vecchio, l'atro di punta. e vuoi usare la stessa app entrambi. al aprirsi, l'app determina se
il dispositivo e vecchio o moderno e sciglie http o okhttp secondo la determinazione. oppure, una app con 2 attivita (con la stessa determinazione).

ma come diceva, e possibile che el vecchio http funziona ancora. provalo. allora, se no hai
un dispositivo moderno, non hai maniera di provare.
 

Elric

Well-Known Member
Licensed User
due donne alla volta o due librerie - pericolose.
?
Chiaro il concetto.
al aprirsi, l'app determina se il dispositivo e vecchio o moderno e sciglie http o okhttp secondo la determinazione. oppure, una app con 2 attivita (con la stessa determinazione).
Al momento fa esattamente questo e, in base alla versione di Android, apre una B4XPage anziché un'altra.

Ma qual è la sintassi per far scegliere che libreria utilizzare?

Encomiabile il fatto di voler supportare ancora tutti............. ma la tecnologia và avanti e ormai gli Android 4.4 penso siano quasi estinti.
E i 5.0 seguiranno a breve.
Io mi ritrovo con 2 tablet, da 8" e da 10" e non so che farmene.

Mi chiedo quindi quanto valga la pena di arrovellarsi per cercare workaround per una frazione di utenti davvero minuscola, dalle statistiche della distribuzione delle varie versioni di Android.
Workaround che potrebbero anche generare problemi alla app, di sicurezza o altro.
Chiarissimo.

Ma infatti non voglio rinunciare alla sicurezza. Tuttavia, creare walkaround serve oltre che a soddisfare pochi highlander anche a studiare, esercitarmi e scoprire cose nuove. :)
E' un pò come se oggi i vari software desktop venissero ancora studiati anche per Windows 95, mentre è già stato abbandonato Windows 7.
Abandonwares è un mondo affascinante e uno splendido tutto nel passato.
Così............. solo un pensiero. :) :)
Grazie di averlo condiviso! :)
 

drgottjr

Expert
Licensed User
Longtime User
Al momento fa esattamente questo e, in base alla versione di Android, apre una B4XPage anziché un'altra.

Ma qual è la sintassi per far scegliere che libreria utilizzare?
la prima cosa che vuoi fare è provare con il vecchio http e un dispositivo moderno. se non funziona, non vale la pena seguire.
non so assolutamente nulla di b4x pages.

possibilita:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    Dim ph As Phone       ' <<<<<<< libreria Phone
    Dim useOKhttp As Boolean
End Sub

Sub Activity_Create(FirstTime As Boolean)
    useOKhttp = False
 
    If ph.SdkVersion > 4 Then    ' utilizziamo il nuovo dispositivo
        useOKhttp = True         ' dunque
     
        ' ***** OPPURE *****
     
        StartActivity( attivitaConOKhttp )
    End If
 
    ' se useOKhttp e ancora falso, usiamo http o (continuiamo in l'attivita principale)
    ' per me, 2 attivita e la soluzione piu semplice (ma con codice doppio)
    ' mescolando okhttp e http nella stessa activita o funziona o no funziona (non lo so)
    ' e piui possibile che funzione se esiste 2 classi (una con okhttp, l'atra con http) per
    ' per evitare un conflitto, che probabilemente troverai.  con cautela.
 
End Sub


AGGIORNAMENTO

le 2 classi *.bas (httputils e okhttputils) usano il stesso nome "httpjob":
ad ess, dim myjob as httpjob

questo no va funzionare. cosi, non c'e modo di distinguere tra http e okhttp.
devi modificare una classe o l'atra. molto lavoro e soggetto a errori

e piu facile usare 2 attivita. usai attivita2 soltanto per scaricare, passando
dopo il risultato a main. attivita2 usara, diciamo, okhttp. main usara http.
passando il risultato a main e facile. lo faccio spesso


altro aggiornamento

mancava un modulo!
 

Attachments

  • oldhttputils.zip
    18.5 KB · Views: 153
Last edited:
Top