Forzare lo scaricamento di un file

Come forzare il browser a mostrare la finestra di dialogo per salvare un file

Vi è mai capitato di non volere l'anteprima di un file in una finestra del browser? Ad esempio impedire l'apertura di Adobe Reader quando si clicca un link che punta ad un file PDF, mentre invece si desidera mostrare una finestra di dialogo per il salvataggio del file?

Forzare lo scaricamento di un file

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.