Scaricare da Windows Mobile un file CAB in una pagina HTML

Scenario: distribuzione di un applicativo per palmare attraverso un comodissimo file CAB, linkato in una pagina di un sito ottimizzata per piccoli schermi, in modo da diffondere via email il link alla pagina, cosicche’ gli utenti interessati possano navigare con il loro Pocket Internet Explorer all’indirizzo fornito, tappare sul link e installarsi il software. Probabilmente in modo più semplice e più "Avanti, Avanti, Avanti, Finito" per distribuire un’applicazione per Windows Mobile.

Soluzione semplice e banale, come banale dovrebbe essere la sua realizzazione. Una paginetta HTML dove mettere il link al CAB grazie all’arcinoto tag <A> che punta a quel file. E invece no! Sul mio palmare e su un altro paio dove ho fatto le prove, per non so quale motivo, Pocket Internet Exporer, una volta tappato sul link, non chiede dove salvare il file, ma lo "apre" visualizzandone il contenuto inline e rendendone quindi impossibile lo scaricamento (o download, che fa piu’ fico).

Gira che ti rigira, grazie alla fondamentale imbeccata di Lorenzo, ho trovato un workaround che funziona alla grande, permettendo anche di fare altre cosette davvero sfiziose.

Sostanzialmente si tratta di sostituire il link diretto al file CAB nel tag <A> della pagina con un link ad un file in PHP che restituisce il file CAB da scaricare. In questo modo Pocket Internet Explorer non ci puo’ mettere del suo e come risultato si ottiene un meccanismo a prova di configurazione utente.

Di seguito riporto la situazione semplice, che pero’ genera l’errore:

PaginaDownload.html

<A href=’programma.cab’>Scarica il programma direttamente sul tuo palmare</A>

E di seguito come risolverla:

PaginaDownload.html

<A href=’getfile.php’>Scarica il programma direttamente sul tuo palmare</A>

getfile.php

<?php

//filename
$file = ‘programma.cab’;

// We’ll be outputting a CAB
header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header(‘Content-Description: File Transfer’);
header(‘Content-type: application/octet-stream’);
header(‘Content-Length: ‘ . filesize($file));
header(‘Content-Disposition: attachment; filename="’ . $file . ‘"’);

// The PDF source is in original.pdf
readfile($file);
?>

Una raccomandazione fondamentale, che potrebbe farvi risparmiare il paio d’ore che ci ho messo io a capire dove era l’errore. Non devono esserci righe vuote o spazi bianchi prima e dopo i tag <?php e ?>, altrimenti il risultato tornato dallo script sarà il file cab più questi spazi o righe vuote in testa o in coda ad esso. Poi è normale che alcune versioni di Windows Mobile, in fase di installazione del file, si incartano e dicono che quello scaricato non è un file CAB valido, mentre ad altre non importa nulla e terminano correttamente il tutto. Microsozz!

Per quanto riguarda le cose sfiziose da farci, beh… Dal controllare gli effettivi download del file, distribuire file diversi a seconda dello user agent del browser che richiede il file, fino al blocco di alcuni ip (pagina pubblica, download del file ristretto solo ad alcuni) o richiesta di username e password… Insomma, it’s php baby!

Leave a Reply