Newsgroup: it.comp.www.php
Titolo: Help: Linkare parecchi file

Ho la necessità di fare una pagina con diversi file da scaricare circa un
centinaio, ho trovato uno script che mi genera la lista, ma se provo a
scaricare un file non funziona, sembra scaricarlo ma invece scarica un file
html di 1kb contentente una stringa di errore. Vi riporto lo script php, se
trovate l'errore fatemi sapere. Secondo me il problema è generato dal file 
downloadit.php, c'è il modo per non utilizzarlo e semplificare la cosa?
Ecco la pagina dove elencheremo tutti i contenuti della nostra cartella docs
<HTML>
<BODY>
<TABLE BORDER=8 WIDTH=40% ALIGN=CENTER BORDER=3>
<TR><TH>Fai clic sui link per scaricare i file</TH></TR>
<?
# elenco dei contenuti di una cartella con link
$cartella = opendir('docs');
while ($file = readdir($cartella)) {
$array_file[] = $file;
}
foreach ($array_file as $file) {
echo "<TR><TD><CENTER>";
if ( $file == ".." || $file == ".") {
continue;
}
$dimensioni_file=filesize("docs/".$file);
echo "<a href=\"
downloadit.php?nome_file=$file&dimensioni_file=$dimensioni_file
\">$file</a>,<BR>";
echo "</TR></TD></CENTER>";
}
?>
</TABLE>
</BODY>
</HTML>
Qunado clicco sul file  va alla pagina downloadit.php accodando le
informazioni del file.
---------------------------------
FILE downloadit.php:
<?php
header("Content-type: Application/octet-stream");
header("Content-Disposition: attachment; filename=$nome_file");
header("Content-Description: Download PHP");
header("Content-Length: $dimensioni_file");
readfile($nome_file);
?>
Questa pagina non fa altro che ricevere le informazioni e scaricare il file

 file
al volo direi..
readfile('docs/' . $nome_file);
-- 
www.iuz-lab.info

 
altrimenti prova..
<?php
$files_path = './docs/';
if (isset($_GET['file_name']) AND file_exists($files_path . $file_name)) {
        header('Content-type: Application/octet-stream');
        header("Content-Disposition: attachment; filename=$file_name");
        header("Content-Description: Download of $file_name");
        header("Content-Length: " . filesize($files_path . $file_name));
        readfile($files_path . $file_name);
        die();
}
echo "<table border='0' cellpadding='0' cellspacing='1' bgcolor='gray'>\n";
$dirh = opendir($files_path);
if (isset($dirh) AND is_resource($dirh)) {
        while ($dir_element = readdir($dirh)) {
                if (is_file($files_path . $dir_element)) {
                        $files[] = $dir_element;
                }
        }
        unset ($dir_element); 
        closedir ($dirh);
}
while (list(, $name) = each($files)) {
        echo "<tr><td bgcolor='lightgray'><a
href='{$_SERVER['PHP_SELF']}?file_name=$name'>$name</a></td></tr>\n";
}
echo '</table>';
?>
-- 
www.iuz-lab.info

Ora ci provo ma devo inserire solo questo senza creare alcun file tipo 
downloadit.php?
Cmq grazie mille per l'interessamento al mio problema, ti saprò dire domani 
se funziona! 

 domani se funziona!
-- 
www.iuz-lab.info

>dovrebbe andare bene ma fai qualche test comunque..
Funziona!!!
Grazie mille! Ho solo altri due quesiti e premetto che mi comprerò un bel 
manuale di PHP!
1) C'è un modo per fargli capire il tipo di file che sta per scaricare? Nel 
senso che quando clicco sul link con il destro e gli dico "salva oggetto con 
nome..." mi apre la finestra per selezionare la cartella dove voglio 
salvarlo, ma in "Salva come:" mi imposta sempre HTML Document e non, ad 
esempio Archivio Zip, ecc.
2) C'è un modo per creare i link anche delle sottocartelle? Se io ho:
DOCS|--->file1.zip
           |      file2.zip
           |
           |DOCS2|--->file3.zip
                                file4.zip
Come possono venirmi fuori tutti magari con anche il path delle 
sottocartelle rispetto a quella di partenza tipo:
file1.zip
file2.zip
DOCS2\file3.zip
DOCS2\file4.zip
??????????????????????????????????????????????????????????????????????????????????????
Ancora grazie per l'aiuto che mi hai dato finora, e sono già contento così, 
queste due domande sarebbero un extra di gioia! 

 così, queste due domande sarebbero un extra di gioia!
una delle due l'ho risolta per il discorso dell'HTML Document è molto
probabile che tu debba modificare gli header..
comunque se non devi mantenere invisibile la posizione reale dei file da
scaricare e o se i file/directory sono molti ti conviene cambiare approccio
(fammi sapere)..
intanto prova..
<?php
$path = './docs/';
if (isset($_GET['file_name']) AND !preg_match("/\.\.\/|\/\.\./i",
$_GET['file_name']) AND file_exists($path . $_GET['file_name'])) {
        header('Content-type: Application/octet-stream');
        header("Content-Disposition: attachment; filename={$_GET['file_name']}");
        header("Content-Description: Download of {$_GET['file_name']}");
        header("Content-Length: " . filesize($path . $_GET['file_name']));
        readfile($path . $_GET['file_name']);
        die();
}
function ls ($path, $dir = ''){
        $dirh = opendir ($path . $dir);
        $list = array();
        if (is_resource ($dirh)) {
                while ($dir_element = readdir ($dirh)) {
                        if ($dir_element != '.' AND $dir_element != '..') {
                                if (is_dir ($path . $dir . $dir_element)) {
                                        $dirs[] = $dir_element;
                                }
                                if (is_file ($path . $dir . $dir_element)) {
                                        $files[] = $dir_element;
                                }
                        }
                }
                closedir ($dirh);
                if (isset($dirs) AND is_array($dirs)) {
                        sort($dirs);
                        while (list(, $cdir) = each($dirs)) {
                                $list = array_merge($list, ls(&$path, $dir . $cdir . '/'));
                        }
                }
                if (isset($files) AND is_array($files)) {
                        sort($files);
                        while (list(, $cfile) = each($files)) {
                                $list[] = $dir . $cfile;
                        }
                }
        }
        return ($list);
}
echo "<table border='0' cellpadding='0' cellspacing='1' bgcolor='gray'>\n";
$files_list = ls (&$path);
while (list(, $name) = each($files_list)) {


Ok, mi visualizza anche il path delle sottocartelle, ma quando scarico il 
file mi dice sempre che è un "Documento di testo" e nella pagina mi 
visualizza questi due messaggi di errore
Warning: Call-time pass-by-reference has been deprecated - argument passed 
by value; If you would like to pass it by reference, modify the declaration 
of [runtime function name](). If you would like to enable call-time 
pass-by-reference, you can set allow_call_time_pass_reference to true in 
your INI file. However, future versions may not support this any longer. in 
C:\WM\www\test2\index.php on line 44
Warning: Call-time pass-by-reference has been deprecated - argument passed 
by value; If you would like to pass it by reference, modify the declaration 
of ls(). If you would like to enable call-time pass-by-reference, you can 
set allow_call_time_pass_reference to true in your INI file. However, future 
versions may not support this any longer. in C:\WM\www\test2\index.php on 
line 59
Cmq ti ringrazio davvero tanto per l'aiuto! 

