PDA

View Full Version : [PHP] Creare file Zip per download center


leox_80
23-11-2006, 14:51
Salve a tutti.

Ho la necessità di creare un download center.
Nel sito che sto realizzando, durante la navigazione, l'utente ha la possibilità di aggiungere ad un carrello i file da potersi scaricare in blocco dalla pagina dedicata.

Il mio problema è che questi file arrivano a pesare anche 10Mb o più ognuno.
Se creo un file Zip al volo il server mi restituisce il messaggio che sono pazzo (vai a dargli torto) e che ho ecceduto nell'allocazione.

Le domande sono:

1) Esiste uno script per zippare o per fare qualcosa di analogo (cioè che comunque mi permetta di scaricare i file in blocco) che non crei questo problema?

2) Se non esiste lo script, qualcuno sa suggerirmi un metodo per realizzare sta cosa?

Grazie

leox_80
24-11-2006, 10:38
up

leox_80
27-11-2006, 10:03
up

Poix81
27-11-2006, 10:15
potresti provare a creare "fisicamente" il file zip e poi farlo scaricare.

ciao ciao

leox_80
27-11-2006, 16:53
## Output file
$output = $_SERVER['DOCUMENT_ROOT']."/zip/".str_replace(array(" ", ".") , "", microtime()).".zip";

############################
# ciclo che crea la lista di file in filenames
############################
## E' solo un esempio

while($condizione)
$filenames .= ' "'.$pathalfile."'"; ## Lo spazio all'inizio è importante

###############################################

exec('zip -j '.$output.$filenames);

$temp = tmpfile();

$src = fopen($output, 'r');

while(!feof($src))
{
$content = fread($src, 100000);
fputs($temp, $content);
}

fclose ($src);

unlink($output);

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=FileTemp.zip;" );
header("Content-Transfer-Encoding: binary");

fseek($temp, 0);

while(!feof($temp))
{
echo fread($temp, 100000);
}

exit();


Ok, la soluzione di creare il file fisico era già stata valutata. Il problema rea che non avrei saputo quando cancellarlo e soprattutto, anche avessi deciso di dargli un giorno di vita, lo spazio sul server era limitato. Per il momento ho elaborato questa soluzione... dopo giorni di ricerca.

Creo il file fisicamente con linea di comando linux, lo copio in un file temporaneo, cancello il file fisico, invio il file temporaneo.

Questo perchè il file temporaneo creato con tmpfile() viene distrutto alla fine dello script (o facendo fclose()) e quindi anche nel caso il download venisse annullato il file verrebbe distrutto comunque!

Se vete altre soluzioni migliori ben vengano.

Ciao, Leandro