Problema con header

ieldna

Nuovo Utente
26 Giu 2010
19
0
0
Genova
Buon giorno a tutti, sono nuovo e vi pongo già una domanda:

Ho un dominio su aruba sul quale gestico un sito. Recentemente ho messo una sezione download dove l'utente con il classico tastino download può scaricare il file scelto.
Il mio problema consiste nell'utilizzo degli header, in particolare di header("Content-Length: blabla");

Infatti voglio inserire quella informazione in modo che il browser capisca quanto pesi il file e possa dare una stima del tempo necessario per il download. Il fatto che se inserisco quella riga di codice il file zip scaricato, alla fine del download risulta corrotto, con qualunque programma di archiviazione, ho navigato un po' per il web ma non ho trovato errori simili oppure non ho cercato le parole giuste.

Qualcuno sa darmi una dritta o una soluzione al mio problema?


Qua la porzione di codice che uso per il download:

PHP:
    $file = "files/file_da_scaricare.zip";
    header('Content-Description: File Transfer');
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename=mio_bel_file.zip');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    readfile($file);
 
Ultima modifica:
Ciao, io ho provato questo script da me, sia in locale che su server (aruba tra l'altro) e funziona alla grande. Può darsi che il file .zip è stato uplodato male, riprova con ftp a volte succede
 
E' quello che ho pensato all'inizio. Il fatto che scaricato dal browser mi dà l'errore, ma via ftp se lo salvo sul computer non mi dà nessun problema.
Anzi per essere più precisi a me personalmente non viene scaricato corrotto e ad alcuni miei amici funziona, ma a molti utenti risulta comunque corrotto, escludo a priori la loro incapacità per il fatto che cominciano ad essere numerosi a segnalarmelo.
 
giusto per curiosità, il problema si verifica con tutti i browser?
 
Si verifica con tutti i browser, vi dirò di più, adesso ho risolto facendo link diretto al file con

PHP:
header("Location: posizione_file_da_scaricare");

e funziona perfettamente ma mi chiedo perchè il file mi risultava corrotto con l'altro metodo!
 
più che altro mi chiedo perché in certi casi risultasse corrotto e in altri no..
 
Non ne ho la minima idea, ed è una cosa che odio troppo xD comunque adesso sono riuscito a risolvare il problema, ho messo il codice che gestisce il download in un altra pagina e va magicamente, boh!!!! Meglio così. =)
 
se mail dovessi riuscire a trovare l'origine del problema faccelo sapere:byebye:
 
Credo, ma non ne sono sicuro che il problema fosse causato dal fatto che nella stessa pagina del download avevo inserito il codice per il download e per arrivare a quella pagina si passa attraverso un sistema di frame in php, ma non ne sono sicuro =)
 
Non è proprio frame la pagina rimane uguale ma in una cella di una tabella ho messo

PHP:
if(isset($_GET['pag']))
{
	include $_GET['pag'].".php";	
}
else
{
        include "home.php";
}

e non mi dava nessun problema!
 
Ciao a tutti, io mi trovo alle prese con una situazione molto simile che in parte ho risolto.

Lo script di partenza è il seguente:

PHP:
function output($file)
{
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/zip");
header('Content-Disposition: attachment; filename='.$file);
header("Content-Transfer-Encoding: binary");
$out = $this->file();
header('Content-Length: '.strlen($out));
		
echo($out);
exit();
}

La funzione fa parte di una classe che genera dinamicamente il file zip come stringa binaria e lo passa al browser senza salvarlo sul server.

Nel mio caso l'archivio risultava corrotto con tutte le versioni di IE ma è ok con gli altri browser.
Sono riuscito a risolvere sostituendo la riga:

PHP:
header("Content-Type: application/zip");

con

PHP:
header("Content-Type: multipart/x-zip");

Spero (visto che invece il tuo problema sembra presentarsi un po' ovunque) che possa essere utile.

L'unica cosa che cmq non funziona è che qualunque browser sembra ignorare completamente le informazioni sulle dimensioni del file e riporta "dimensione sconosciuta".

Qualche idea in proposito?

Ciao e Grazie!
 
Forse utilizzare strlen non è un'ottima idea, anche perché quella funzione restituisce la lunghezza della stringa, non la grandezza di un file in byte. Prova ad utilizzare filesize al suo posto.

Comunque se volete risolvere ogni problema basterebbe salvare in un file temporaneo i dati da scaricare e poi effettuare un redirect del browser. In questo modo tutti gli header saranno sicuramente corretti.

P.S. Se ve lo state chiedendo no, non soffro di insonnia, ma oggi mi sento mattutino :D
 
In realtà anche a me sembrava strano l'utilizzo di strlen, ma l'ho testata e restituisce la dimensione esatta del file.

Considera che nel mio caso il file da scaricare non esiste (è proprio una stringa) e oltretutto filesize prende come argomento un percorso e non un contenuto.

La soluzione che prospetti potrebbe andare, ma vorrei evitarla e soprattutto sono curioso di sapere dove sta l'inghippo.

Cmq grazie
 
Guardate io ho risolto linkando il download di un file a downloadManager.php che ha questo codice, funziona con tutti i browser senza problemi, legge la dimensione del file e tutto.

Pagina del download:

HTML:
<html>
<body>
<a href="downloadManager.php?name=file_da_scaricare">Clicca qua per scaricare</a>
</body>
</html>

Download Manager

PHP:
<?php
$referrer = $_SERVER['HTTP_REFERER'];
if(isset($_GET['type']) && isset($_GET['name']))
{
	$nome = $_GET['name'].".zip";
	$url = "files/".$nome;
	$dimensioni = filesize($url);
	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/force-download");
	header ("Content-Disposition: attachment; filename=\"" . $nome . "\";");
	header ("Content-Description: File Transfer");
	header ("Content-Transfer-Encoding: binary");
	header ("Content-Length: $dimensioni");
	set_time_limit (0);
	@readfile ($url);
}
?>
 
Io però se fossi in te starei attento. Basterebbe inserire un URL come downloadManager.php?file=../file_riservato per scaricare un file zippato fuori dalla directory files. Per ovviare puoi usare la funzione realpath per controllare la reale directory da cui il file deve essere scaricato. Se non è files blocchi tutto. Prima, ovviamente, dovrai cambiare la directory di esecuzione dello script con chdir, impostandola al percorso in cui si trova il file downloadManager.php.
 

Discussioni simili