2010-01-18 17 views
9

sto cercando di forzare il download di un file zip protetto (non voglio che la gente di accedervi senza effettuare il login prima.Download del file .zip esegue un file php danneggiato

ho la funzione creata . per la login e così, ma sto correndo in un problema in cui il file scaricato è corruttore

Ecco il codice che ho:

$file='../downloads/'.$filename; 
header("Content-type: application/zip;\n"); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-length: ".filesize($file).";\n"); 
header("Content-disposition: attachment; filename=\"".basename($file)."\""); 
readfile("$file"); 
exit(); 

Ecco l'errore: Cannot open file: It does not appear to be a valid archive.

Il file si scarica bene altrimenti, quindi deve essere qualcosa che sto facendo male con le intestazioni.

Qualche idea?

risposta

18

Questo problema può avere diverse cause. Forse il tuo file non viene trovato o non può essere letto e quindi il contenuto del file è solo il messaggio di errore PHP. Oppure l'intestazione HTTP è già stata inviata. O hai qualche output aggiuntivo che poi corrompe il contenuto del tuo file.

tenta di aggiungere un po 'di gestione degli errori nel vostro script come questo:

$file='../downloads/'.$filename; 
if (headers_sent()) { 
    echo 'HTTP header already sent'; 
} else { 
    if (!is_file($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 
     echo 'File not found'; 
    } else if (!is_readable($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); 
     echo 'File not readable'; 
    } else { 
     header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
     header("Content-Type: application/zip"); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-Length: ".filesize($file)); 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
     readfile($file); 
     exit; 
    } 
} 
+0

Awesome Gumbo! Questo ha risposto. Ecco ... penso che le intestazioni inviate siano la ragione per cui non funzionava. – Troy

6

Scommetto due birre che si verifica un errore PHP e il messaggio di errore rovina il file ZIP. Il file richiesto probabilmente non esiste.

Apri il file ZIP con un blocco note o un editor di testo simile e scopri cosa c'è che non va.

+6

+1 solo due birre? – danielrsmith

+0

id d'accordo scommetto che c'è un errore nel 'readfile()' come permessi non validi, o può essere trovato ... – prodigitalson

1

Ecco la soluzione creare un file con il nome .htaccess scrittura sotto la linea in quel SetEnv no-dont-gzip variano

carica il file sul tuo sito web. Se avete il file già esiste quindi si prega di effettuare la modifica di cui sopra in quanto

0

provare questo per trovare se c'è qualche errore

error_reporting(0); 

Non stampare nulla prima di scrivere delle intestazioni; eseguire un ob_start() per del vostro script, dopo il codice modificare le intestazioni e quindi ob_flush() e ob_clean()

1

risposta in ritardo, ma forse utile per gli utenti non essere in grado di fare force download lavoro.
Aggiungere il seguente nella parte superiore del vostro php sceneggiatura

<?php 
apache_setenv('no-gzip', 1); 
ini_set('zlib.output_compression', 0); 
Problemi correlati