Posts filed under 'PHP'
Forzare un download anche su IE
Molti sanno che è possibile, grazie ad un corretto uso degli headers, forzare il download di un file. Questo significa che è possibile ad esempio linkare un’immagine JPG facendo in modo che essa non si apra ma al suo posto compaia la finestra “Salva con nome…”.
Internet Explorer naturalmente complica le cose! Gli piace molto aggiungere al nome del file parentesi sia tonde che quadre, nonchè convertire caratteri vari, con comprensibile sgomento di utenti e sviluppatori. In particolare, spazi e punti nel nome del file provocano questi strani comportamenti, tanto che tempo fa partecipai sul forum su PHP di HTML.it alla realizzazione di una pillola sul tema.
Il frutto della discussione fu questa funzione:
function forceDownload($file) {
/**
* Function forceDownload:
* download any type of file if it exists and is readable
* -------------------------------------
* @author Andrea Giammarchi
* @date 18/01/2005 [17/05/2006]
* @compatibility PHP >= 4.3.0
*/
if(file_exists($file) && is_readable($file)) {
$filename = basename($file);
if(strpos(strtoupper($_SERVER['HTTP_USER_AGENT']), 'MSIE') !== false && strpos($filename, '.') !== false) {
$parsename = explode('.', $filename);
$last = count($parsename) - 1;
$filename = implode('%2E', array_slice($parsename, 0, $last));
$filename .= '.'.$parsename[$last];
}
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Length:'.filesize($file));
header('Content-Transfer-Encoding: binary');
if(@$file = fopen($file, "rb")) {
while(!feof($file))
echo fread($file, 8192);
fclose($file);
}
exit(0);
}
}
Add comment 5 Marzo 2008
Andare a capo a metà parola
Capita spesso di creare in HTML tabelle o schemi che devono stare in poco spazio. Si sarebbe disposti anche ad andare a capo interrompendo una parola, ma attualmente CSS e HTML non ci vengono molto incontro. Ecco una soluzione in PHP, facilmente traducibile in JavaScript, testata su IE e Firefox:
function hardWordWrap($q){
$result="";
for($i=0;$i<strlen($q);$i++){
if (isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false)){
$result.=$q[$i].'';
}else{
$result.=$q[$i].'&'.'#8203;';
}
}
return $result;
}
Add comment 16 Ottobre 2007
