Ciao ragazzi, ho già passato penso 3/4 delle discussioni sul download di file mediante php presenti su internet ma continuo ad avere un problema fastidioso.
Ho già messo giù la function gemella che effettua l'upload:
Codice PHP:
if(isset($_POST['dest'])){
switch(intval($_POST['dest'])){ //questa parte è solo un controllo su 2 opt che mi indicano la subdir in cui fare l'upload
case 1: $path.="backup/"; break;
case 2: $path.="docs/"; break;
default: die("Errore");
}
if(!is_dir($path))
mkdir($path,0777, TRUE);
$path=$path.basename($_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $path)) {
alert("File ".basename( $_FILES['uploadedfile']['name'])." caricato con successo."); //funzione mia che uso per i test, praticamente è l'alert di js
header("refresh:0");
}else{
echo "<pre>";
print_r($_FILES);
echo "</pre>";
}
}
ho verificato sulla mia virtual machine che ospita una fedora per mysql+apache e funziona, i file sono integri e corretti.
Ora, il problema viene con il download. Ogniqualvolta cerco di scaricare un file mi ritrovo un file che ha nome corretto, dimensione apparentemente corretta (ho trovato un paio di casi in cui la dimensione è > di circa 1/2 kB) ma contenuto inesorabilmente uguale: il file html generato dalla mia pagina php. Questo sia che il file si tratti di uno zip che di una immagine, che di un eseguibile.
Aggiungo che apache non l'ho toccato (nella fedora 7 cmq dovrebbe essere recente), quindi forse c'è qualcosa che devo impostare anche lì?
Ecco alcune delle funzioni che ho preso pari pari dal web:
Codice PHP:
function _Download($f_location,$f_name){
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($f_location));
header('Content-Disposition: attachment; filename=' . basename($f_name));
readfile($f_location);
}
Codice PHP:
function forceDownload($file) {
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');
readfile($file);
}
}
Queste sono solo 2 delle non so quante versioni diverse che ho provato
La parte che effettua le call contiene giusto un paio di istruzioni (utilizzate anche dall'upload quindi presumo corrette):
Codice PHP:
$path="/var/www/html/contents/files/upload/".create_dir_tree($ex['nome'])."/";
//[..] <- vari controlli per sapere dove andare a prendere il file che mi serve
$path.="backup/";
$file_to_download=(string)$_POST['files_backup']; //non riporto altri controlli
forceDownload($path.$file_to_download);
Aggiungo solo che il sito che sto realizzando è il mio primo e che è per uso strettamente interno, quindi preferisco imparare qualcosa e poi sistemare le eventuali falle di sicurezza.
Vi ringrazio in anticipo per il supporto! S!