Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Download file forzato evitando file corrotti con PHP

Da Programmazione Software.

Mi sono imbattuto l'altro giorno in un problema banale ma che mi stava facendo impazzire. Ho uno script che uso da anni per forzare il download dei file con PHP. Il problema è che, casualmente, provando a fare il download di un file ODS (OpenOffice), il file che scaricavo era corrotto.

Questo è il codice che usavo normalmente per il download forzato:

header("Content-type: Application/octet-stream");
header("Content-Disposition: attachment; filename=\"$nomeFile\"");
header("Content-Description: Download PHP");
header("Content-Length: ".strlen($content));
echo $content;
exit;

Per togliermi subito lo scrupolo che il file che stavo per andare a scaricare fosse uguale all'originario, ho messo prima di queste righe:

var_dump( strlen($content), md5($content) );

ma il risultato è che il file che stavo scaricando coincideva con l'originario sia in lunghezza che in md5. Quindi quello che stavo scaricando era identico a quello originario.

Il problema dunque doveva essere in quell'"echo" finale.

Infatti così era. Probabilmente c'era qualche carattere che veniva stampato prima.

Quindi in definitiva il codice php corretto per forzare il download è:

header("Content-type: Application/octet-stream");
header("Content-Disposition: attachment; filename=\"$nomeFile\"");
header("Content-Description: Download PHP");
header("Content-Length: ".strlen($content));
ob_clean();
echo $content;
exit();

dove ob_clean() pulisce completamente il buffer in output prima di inviare il contenuto del file al browser tramite l'"echo".