Modificare gli header per forzare lo scaricamento di un file
La soluzione è quella di inviare una intestazione opportuna al browser in modo che esso venga forzato a non aprire il file ma a salvarlo. In generale il codice PHP per implementare questa funzionalità è piuttosto semplice, in pratica bisogna impostare:
header("Content-Disposition: attachment; filename= "nomedelfile");
In Drupal, se si volesse gestire manualmente, sarebbe necessario implementare un modulo che intercetti la consegna del file ed imposti gli header. Fortunatamente esiste anche un modulo che lo fa già al posto nostro. Si tratta di File Force.
Il modulo Drupal File Force
Il modulo per Drupal File Force offre dei "formatters", ovvero degli stili di visualizzazione per i campi di tipo "File field" e "Image field" (per Drupal 7), sia nell'interfaccia di visualizzazione dei nodi che nel modulo Views. In questo modo i file contenuti nei campi mostrati attraverso le visualizzazioni fornite da File Force non verranno aperti in anteprima all'interno del browser bensì potranno essere scaricati direttamente.
Il modulo File Force è disponibile anche per Drupal 6 e supporta diversi moduli:
- Upload (fornito con il core Drupal 6)
- FileField
- Image
- ImageCache
- ImageField
- iTweak Upload
E se invece voglio aprire un file in una nuova finestra?
Per completezza, ecco un semplice spunto per coprire una terza casistica: quando va bene che il file sia aperto direttamente nel browser, ma lo si vuole aprire in una nuova finestra.
Per far ciò basta aggiungere l'attributo target="_blank"
al link. Volendo lo si può fare anche usando del codice JavaScript / jQuery manipolando l'attributo "target" con il valore "_blank": $(el).attr('target', '_blank')
, metodo decisamente poco elegante.